1

我有以下 xml

<test>
    <nodeA>
           <nodeB>key</nodeB>
           <nodeC>value1</nodeC>
    </nodeA>
    <nodeA>
           <nodeB>key</nodeB>
           <nodeC>value2</nodeC>
    </nodeA>
</test>

如何连接并获取 xpath 中的所有值/test/nodeA/nodeC?在这种情况下,我的预期输出是value1value2

从我所读到的内容中,我不确定使用 xpath 是否可行,但感谢您的帮助。

PS:我正在使用来自 Ximpleware 的VTD-XML在 Java 中解析相同的内容。也欢迎任何基于 Java 的解决方案。目前我的java解决方案只给出了第一个值,即value1

4

4 回答 4

5

XPath 将返回一个NodeList您可以迭代和连接的:

StringBuilder concatenated = new StringBuilder():
XPath xpath = XPathFactory.newInstance().newXPath();
String expression = "/test/nodeA/nodeC/text()";
InputSource inputSource = new InputSource("sample.xml");
NodeList nodes = (NodeList) xpath.evaluate(expression, inputSource, XPathConstants.NODESET);
for(int i = 0; i < nodes.getLength(); i++) {
    concatenated.append(nodes.item(i).getTextContent());
}
于 2015-10-09T11:56:16.217 回答
1

这是一个使用XmlSlurper的 groovy 实现(在 2 行代码中!)

def xml = new groovy.util.XmlSlurper().parse(new File('sample.xml'))
print xml.nodeA*.nodeC.join("")

输出

value1value2

我不在生产代码中使用 groovy,但对于本地人来说它很棒。我经常在gradle构建文件中有一些 groovy 实用程序。

于 2015-10-09T11:57:30.940 回答
0

如果您希望单个 XPath 表达式返回带有所选值连接的字符串,那么您需要 XPath 2.0(或更高版本)和 XQuery 1.0(或更高版本),您可以在其中执行string-join(/test/nodeA/nodeC, ''). XPath 1.0 没有为您提供字符串的表达能力,但当然,正如另一个答案中已经显示的那样,您可以迭代选定的节点并以 Java 等宿主语言连接选定的值。

于 2015-10-09T12:06:09.317 回答
0

这就是我使用 VTD-XML 的方式......

import com.ximpleware.*;


public class concat {
     public static void main(String[] s) throws VTDException{
         VTDGen vg = new VTDGen();
         if (!vg.parseFile("input.xml", false))
             return;
         VTDNav vn = vg.getNav();
         AutoPilot ap = new AutoPilot(vn);
         ap.selectXPath("/test/*/nodeC/text()");
         StringBuilder sb = new StringBuilder(100);
         int i=0;
         while((i=ap.evalXPath())!=-1){
             sb.append(vn.toString(i));
         }
         System.out.println(sb.toString());
     }

}
于 2016-04-09T01:04:37.360 回答