如何使用Xpath检索XML树节点之后的节点?

首先,我必须说我发现Xpath是一个非常好的解析器,我认为将它与其他解析器进行比较时非常强大。

给出以下代码:

  DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse("input.xml"); XPath xpath = XPathFactory.newInstance().newXPath(); 

如果我想找到第1轮和第1轮的first节点,请点击此处:

   1  abd11  0 25 0.31   25 50 0.04   50 75 0.19   75 100 0.46    vvv1133  60 62 1.0     2  eee  0 -25 0.31   -25 -50 0.04   -50 -75 0.19   -75 -100 0.46    cc  -60 -62 0.3   -70 -78 0.7     

我会这样做的:

  XPathExpression expr = xpath.compile("//Round[1]/Door[1]/Value[1]/*/text()"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; 

如果我想要第1轮和第1轮的second节点,那么:

 XPathExpression expr = xpath.compile("//Round[1]/Door[1]/Value[2]/*/text()"); 

但是我怎么用循环来做这个,因为我不知道我有多少Value-nodes ,这意味着我怎么能用循环来做这个,每次迭代我检索3(我的意思是xVal1xVal2pVal值) )Value节点的更多值!

要求这个的原因是:

  1. 我不知道我有多少Round

  2. 我不知道我有多少Value

  3. 我不想每次都声明一个新的XPathExpression

谢谢 。

选项1 – 迭代文档中的所有Value元素。 只需要一次评估,但很难知道该值属于哪个Round或Door元素。

 NodeList result = (NodeList) xpath.evaluate("//Round/Door/Value/*/text()", doc, XPathConstants.NODESET); 

选项2 – 分别迭代每个Round,Door和Value元素。 需要更多评估,但上下文很容易知道。 如果需要索引,则很容易为循环添加计数器。

 // Get all rounds and iterate over them NodeList rounds = (NodeList) xpath.evaluate("//Round", doc, XPathConstants.NODESET); for (Node round : rounds) { // Get all doors and iterate over them NodeList doors = (NodeList) xpath.evaluate("Door", round, XPathConstants.NODESET); for (Node door : doors) { // Get all values and iterate over them NodeList values = (NodeList) xpath.evaluate("Value/*/text()", door, XPathConstants.NODESET); for (Node value : values) { // Do something } } } 

选项3 – 根据您的要求做上述的一些组合

请注意,我已删除表达式编译步骤以缩短示例。 应该重新添加它以提高性能。