如何提取XPath指向的所有值?

时间:2015-10-09 11:46:17

标签: java xml xpath vtd-xml

我有以下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,但感谢您的帮助。

P.S:我正在使用来自Ximpleware的VTD-XML来解析Java中的问题。任何基于Java的解决方案也欢迎。目前我的java解决方案只提供第一个值,即value1

4 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:1)

这是一个使用XmlSlurper

的groovy实现(在2行代码中!)
def xml = new groovy.util.XmlSlurper().parse(new File('sample.xml'))
print xml.nodeA*.nodeC.join("")

输出

value1value2

我不会在生产代码中使用groovy,但是对于本地的捣蛋它很棒。我经常在gradle构建文件中使用很少的常规实用程序。

答案 2 :(得分:0)

如果您希望单个XPath表达式返回带有所选值的串联的字符串,那么您需要分别使用XPath 2.0(或更高版本)XQuery 1.0(或更高版本)来执行string[] str = { "H", "G", "F", "D", "S","A" }; Array.Sort(str); for (int i = 0; i < str.Length; i++) { Console.WriteLine(str[i]); } Console.ReadLine(); 。 XPath 1.0没有赋予字符串的强大功能,但当然,正如另一个答案中所示,您可以遍历所选节点并使用Java等宿主语言连接所选值。

答案 3 :(得分: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());
     }

}