如何使用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(我的意思是xVal1
, xVal2
和pVal
值) )Value节点的更多值!
要求这个的原因是:
-
我不知道我有多少
Round
-
我不知道我有多少
Value
-
我不想每次都声明一个新的
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 – 根据您的要求做上述的一些组合
请注意,我已删除表达式编译步骤以缩短示例。 应该重新添加它以提高性能。