【问题标题】:JAXP: How to force XPath to validate namespace prefixes?JAXP:如何强制 XPath 验证名称空间前缀?
【发布时间】:2011-09-11 22:13:45
【问题描述】:

我依赖于默认的 JAXP 实现并使用 Oracle JRE。 在评估包含未知名称空间前缀的 XPath 时,它不会抛出(预期的)异常。

当我在 IBM JRE 上运行相同的应用程序时,一切都很好,它抛出了预期的异常 javax.xml.xpath.XPathExpressionException: org.apache.xpath.domapi.XPathStylesheetDOM3Exception: Prefix must resolve to a namespace

我正在使用以下代码尝试访问 invalid namespace unknownns

  DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
      .newInstance();

  documentBuilderFactory.setNamespaceAware(true);
  documentBuilderFactory.setValidating(true);
  documentBuilderFactory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);

  DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder();

  Document doc = builder.parse(xmlFile_);

  XPath xpath = XPathFactory.newInstance().newXPath();
  NodeList nodeList = (NodeList) xpath.evaluate("path/to/node/unknowns:@bla", doc,
      XPathConstants.NODESET);

问题:

如何独立于 JAXP 实现来强制执行此验证?

【问题讨论】:

  • 您能否发布负责初始化和配置 DocumentBuilderFactory 实例以及 XPathFactory 和 XPath 实例的代码?
  • @Vineet 我已经更新了问题。
  • XPathFactory.newInstance() 返回的对象的类是什么?

标签: java xml validation xpath jaxp


【解决方案1】:

在您的XPath 实例上尝试setting NamespaceContext

public final class NSValidator {
  private NSValidator() {
  }

  private static final NamespaceContext INSTANCE = new NamespaceContext() {
    @Override public String getNamespaceURI(String prefix) {
      return null;
    }

    @Override public String getPrefix(String namespaceURI) {
      return null;
    }

    @Override public Iterator<?> getPrefixes(String namespaceURI) {
      return Collections.emptyList()
          .iterator();
    }
  };

  public static NamespaceContext noNamespaces() {
    return INSTANCE;
  }
}

【讨论】:

  • 谢谢你成功了。 IBM JRE 似乎有一个默认的 NamespaceContext,而 Oracle JRE 没有。后者导致默认情况下不会报告与上下文相关的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2015-03-25
相关资源
最近更新 更多