在Java中传递多个xpath时,在NodeList中查找节点号

时间:2018-03-01 10:22:17

标签: java xml xpath xml-parsing javax.xml

我正在使用javax.xml.xpath.XPath包来查找XML中存在的节点。 代码查找值并返回NodeList

NodeList nodes =  (NodeList) xPath.compile("/books/book/category[1] | /books/book/category[2] | /books/book/category[3]").evaluate(xmlDocument,XPathConstants.NODESET);

我的示例XML是:

<books>
<book>
    <name>abc</name>
    <category>category1</category>
    <isbn>152491915491444</isbn>
</book>
<book>
    <name>pqr</name>
    <isbn>1619126541625</isbn>
</book>
<book>
    <name>xyz</name>
    <category>category3</category>
    <isbn>851926542599595</isbn>
</book>
</books>

我在NodeList中得到2个节点作为&#39;类别&#39;在XML的第二个节点中不存在。

那么无论如何识别我从NodeList获得的节点是我在xPath.compile中传递的xpath的结果吗?因为在这里无法识别价值&#39;类别3&#39;来自节点2或3.

或者无论如何都得到XML中的节点号,我得到了结果。在这个例子中,我应该得到节点1和3,因为我得到的类别来自XML的第1和第3个节点。

另一种方法是传递单个xpath而不是多个xpath。但是我不想使用这种方法,因为它很耗时,我必须处理很多这样的XML。

1 个答案:

答案 0 :(得分:0)

我对此有一些评论。首先,我认为你正在使用错误的工具,取决于你想要的输出。其次,XML 1.0没有指定子元素的顺序。大多数解析器将按照指定的顺序返回元素,但它可能不同。

您可以使用以下xpath表达式获得与上面相同的结果:

/books/book/category

NodeList中的节点应该是正确的顺序。如果您需要知道这些元素出现在哪个索引中,那么您需要一个不同的工具,例如SAX解析器。使用Sax解析器,您将能够跟踪已解析的书籍元素的数量,从而为它们提供索引值。