当前位置: 首页 > 知识库问答 >
问题:

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

景成和
2023-03-14

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

am中的示例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

以下是它工作和不工作的情况:

>

  • "XPATH Works":未指定命名空间时
    示例:

    “XPATH有效”:当给定带有前缀的命名空间时,示例:

    “XPATH不起作用”:当给定不带前缀的默认命名空间时示例:

    你能帮我解释为什么saxon以不同的方式对待没有命名空间和默认命名空间吗?还有我如何解决为具有默认命名空间的文档执行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);
    

    谢谢


  • 共有1个答案

    饶明亮
    2023-03-14

    这不是萨克森特有的,而是名称空间工作方式的基本部分。在示例1和2中,RESPONSE元素不在名称空间中,但在案例3中,它(及其所有子元素)位于http://www.abc.com/命名空间。使用javax.xml。xpath API如果您希望能够匹配特定命名空间中的节点,或者由于您在xpath 2.0中,您可以使用*:localName符号来匹配具有给定本地名称的所有节点,而不管其命名空间如何。

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

     类似资料:
    • 问题内容: 我想操作具有默认名称空间但没有前缀的xml文档。有没有办法使用没有名称空间uri的xpath,就像没有名称空间一样? 我相信,如果将documentBuilderFactory的namespaceAware属性设置为false,那应该是可能的。但就我而言,它不起作用。 我的理解是不正确的还是我在代码中做错了? 这是我的代码: 这是我的xml: 问题答案: 使用默认名称空间(无前缀)的文

    • 问题内容: 我想使用JDOM读取XML文件,然后使用XPath从JDOM Document中提取数据。它可以很好地创建Document对象,但是当我使用XPath在Document中查询元素列表时,我什么也没得到。 我的XML文档在根元素中定义了一个默认名称空间。有趣的是,当我删除默认名称空间时,它成功运行了XPath查询并返回了我想要的元素。要使XPath查询返回结果,我还必须做什么? XML:

    • 我正在寻找一个XPath表达式来获取节点的默认名称空间。 我的XML文档可能如下所示。 如果有人能给我一点提示,我将不胜感激。

    • 问题内容: 我是jQuery新手,想解析XML文档。 我可以使用默认名称空间解析常规XML,但可以使用以下XML解析该XML: 我真正想要的只是那个。 到目前为止,我一直在使用: 真的没有运气。有任何想法吗? 问题答案: 我知道了。 原来,它需要逃脱冒号。 正如Rich所指出的: 更好的解决方案不需要转义,并且可以在所有“现代”浏览器上使用:

    • 我需要使用默认命名空间创建/读取xml文件: 但我得到: 我知道包级元数据,但这在复杂的包结构中不起作用: 我已经定义了模型类,如Address: 客户: 公共字段的父类: 然后是保存具体xml XmlBoo的数据/结构的特定类: XmlFoo: package-info.java包括在两个提到的包example.xml.boo: 和example.xml.foo: 最后是主要方法: 我在这里尝试

    • 问题内容: 我正在做这个小项目,我的任务是读取xml文件并进行解析,以便可以将其存储在类中。这是xml示例。它是用SOAP编写的,我要做的就是获取 xmlns:ns2="http://abc.examples.com 问题答案: 要使用Java中的命名空间进行XPath查询,我相信您需要执行以下操作: 您还需要先调用;,然后再创建来解析文档。