关于使用Saxon使用默认命名空间对xml进行xpath解析

时间:2014-02-15 18:27:30

标签: java xml xpath namespaces saxon

我想要一些与使用saxon对默认命名空间进行xpath解析相关的信息。我使用Saxon-HE-9.5.1-3.jar在我的代码中使用xpath 2功能。在类路径中包含saxon库之后,我面临着使用默认命名空间解析XML文档的xpath的问题。

使用以下示例XML:

<?xml version="1.0" encoding="utf-8"?>
<RESPONSE  xmlns="http://www.abc.com/" responseCode="200">
  <HEADER>
    <HITS>100</HITS>
  </HEADER>
</RESPONSE>

有效的XPATH:/ RESPONSE / HEADER / HITS

以下是有效且无效的情况:

  1. “XPATH Works”:未指定命名空间时 示例:<RESPONSE responseCode="200">

  2. “XPATH Works”:当给出带前缀的命名空间时 示例:<RESPONSE xmlns:res="http://www.abc.com/" responseCode="200">

  3. “XPATH不起作用”:当给出带有out前缀的默认命名空间时示例:<RESPONSE xmlns="http://www.abc.com/" responseCode="200">

  4. 请您帮助我解释为什么撒克逊以不同的方式处理没有命名空间和默认命名空间? 另外,我如何解决使用默认命名空间为文档执行xpath的情况。

    以下是我的代码块:

    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    import javax.xml.xpath.XPath;
    import javax.xml.xpath.XPathConstants;
    import javax.xml.xpath.XPathExpression;
    import javax.xml.xpath.XPathExpressionException;
    import javax.xml.xpath.XPathFactory;
    
    import net.sf.saxon.xpath.XPathEvaluator;
    import net.sf.saxon.xpath.XPathFactoryImpl;
    
    .
    .
    .
    
    DocumentBuilder builder;
    Document doc;
    
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
    domFactory.setNamespaceAware(true);
    builder = domFactory.newDocumentBuilder();
    doc = builder.parse(new ByteArrayInputStream(b, 0, size));
    
    XPathFactory factory = XPathFactoryImpl.newInstance(XPathConstants.DOM_OBJECT_MODEL);
    XPathEvaluator xpathCompiler = (XPathEvaluator) factory.newXPath();
    XPathExpression expr = xpathCompiler.compile(xpath);
    NodeList childNodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
    

    谢谢&amp;问候 普拉塔普

1 个答案:

答案 0 :(得分:3)

这不是特定于Saxon的,而是命名空间如何工作的基本部分。在示例1和示例2中,RESPONSE元素不在命名空间中,但在案例3中,它(及其所有后代)位于http://www.abc.com/命名空间中。使用javax.xml.xpath API,如果您希望能够匹配特定命名空间中的节点,则需要定义NamespaceContext,或者由于您使用的是XPath 2.0,因此可以使用*:localName表示法匹配具有给定本地名称的所有节点,无论其名称空间如何。

/*:RESPONSE/*:HEADER/*:HITS