XPath在Java中无法工作

3

我有以下的xml字符串

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Structure>
   <LongUnsigned value="142794"/>
   <OctetString value="07E2051E030F1E0404800000"/>
   <Structure>
      <OctetString value="07E2051E030F1E0404800000"/>
      <OctetString value="66574536387"/>
      <Array>
         <Structure><OctetString value="0000000000000001"/><OctetString value="9889892347"/></Structure>
         <Structure><OctetString value="00098347586768574"/><OctetString value="6283046502"/></Structure>
         <Structure><OctetString value="0000011000000001"/><OctetString value="899734729847586"/></Structure>
      </Array>
   </Structure>
</Structure>

我正在使用下面的xpath,但它总是返回空字符串。
        XPath xPath = XPathFactory.newInstance().newXPath();
        try {
            String eval = xPath.evaluate("//Structure/Structure/Array", new InputSource(new StringReader(xmlString)));
            System.out.println("Eval:" + eval);
        } catch (XPathExpressionException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

我在网上尝试运行此xpath,似乎可以正常工作。为什么在Java中它不能像预期的那样工作呢?


1
上下文不应该是一个“Document”节点吗?您确定使用“InputSource”作为上下文是正确的吗? - Jim Garrison
2
你的 XML 文件中没有包含任何文本数据。你需要调用 evaluate 方法的三个参数版本,并将 XPathConstants.NODESET 或 XPathConstants.NODE 作为最后一个参数传递。 - Erwin Bolwidt
@JimGarrison 可能是两者之一。我尝试过使用DocumentInputSource作为字符串。该字符串实际上是从Document实例生成的。 - thunderbird
2个回答

2

您的XPath表达式选择了一个元素节点,而不是一个字符串。因此,您需要要求将结果作为NODESET返回。


1

我不熟悉Java读取XML,但是你的XPath应该是这样的:

/Structure/Structure/Array/Stucture/OctetString/@value

这将从根节点 <Structure> 开始,向下移动到嵌套的 <Structure>,进一步向下到 <Array>,然后到嵌套的 <OctetString> 元素以获取它们的 value 属性。
您的表达式 //Structure/Structure/Array任何 <Structure> 开始(由于 //),尝试读取 <Array> 的值,但是没有值,只有更深层次的节点...

Michael Kay 的另一个回答正是我想要做的。为你点赞。 - thunderbird

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接