Как получить узел за узлом дерева XML, используя Xpath?
Во-первых, я должен сказать, что я нахожуXpath
как очень хороший синтаксический анализатор, и я думаю, что он довольно мощный, если сравнивать его с другими парсерами.
Дайте следующий код:
<code> DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); domFactory.setNamespaceAware(true); DocumentBuilder builder = domFactory.newDocumentBuilder(); Document doc = builder.parse("input.xml"); XPath xpath = XPathFactory.newInstance().newXPath(); </code>
Если бы я хотел найтиfirst
узел раунда 1 и двери 1, здесь:
<code><Game> <Round> <roundNumber>1</roundNumber> <Door> <doorName>abd11</doorName> <Value> <xVal1>0</xVal1> <xVal2>25</xVal2> <pVal>0.31</pVal> </Value> <Value> <xVal1>25</xVal1> <xVal2>50</xVal2> <pVal>0.04</pVal> </Value> <Value> <xVal1>50</xVal1> <xVal2>75</xVal2> <pVal>0.19</pVal> </Value> <Value> <xVal1>75</xVal1> <xVal2>100</xVal2> <pVal>0.46</pVal> </Value> </Door> <Door> <doorName>vvv1133</doorName> <Value> <xVal1>60</xVal1> <xVal2>62</xVal2> <pVal>1.0</pVal> </Value> </Door> </Round> <Round> <roundNumber>2</roundNumber> <Door> <doorName>eee</doorName> <Value> <xVal1>0</xVal1> <xVal2>-25</xVal2> <pVal>0.31</pVal> </Value> <Value> <xVal1>-25</xVal1> <xVal2>-50</xVal2> <pVal>0.04</pVal> </Value> <Value> <xVal1>-50</xVal1> <xVal2>-75</xVal2> <pVal>0.19</pVal> </Value> <Value> <xVal1>-75</xVal1> <xVal2>-100</xVal2> <pVal>0.46</pVal> </Value> </Door> <Door> <doorName>cc</doorName> <Value> <xVal1>-60</xVal1> <xVal2>-62</xVal2> <pVal>0.3</pVal> </Value> <Value> <xVal1>-70</xVal1> <xVal2>-78</xVal2> <pVal>0.7</pVal> </Value> </Door> </Round> </Game> </code>
Я сделаю это:
<code> XPathExpression expr = xpath.compile("//Round[1]/Door[1]/Value[1]/*/text()"); Object result = expr.evaluate(doc, XPathConstants.NODESET); NodeList nodes = (NodeList) result; </code>
и если бы я хотелsecond
узел раунда 1 и двери 1, то:
<code>XPathExpression expr = xpath.compile("//Round[1]/Door[1]/Value[2]/*/text()"); </code>
но как мне сделать это с помощью цикла, так как я не знаю, сколькоValue-nodes
Я имею в виду, как я могу сделать это, используя цикл, где каждую итерацию я получаю 3 (я имею в видуxVal1
, xVal2
а такжеpVal
values) больше значений узла Value!?
Причины для этого:
Я не знаю сколькоRound
меня есть
Я не знаю сколькоValue
меня есть
Я не хочу объявлять каждый раз новыйXPathExpression
Благодарность