Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何提取XPath指向的所有值?_Java_Xml_Xpath_Vtd Xml - Fatal编程技术网

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

Java 如何提取XPath指向的所有值?,java,xml,xpath,vtd-xml,Java,Xml,Xpath,Vtd Xml,我有下面的xml <test> <nodeA> <nodeB>key</nodeB> <nodeC>value1</nodeC> </nodeA> <nodeA> <nodeB>key</nodeB> <nodeC>value2</nodeC>

我有下面的xml

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

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

从我所读到的内容来看,我不确定xpath是否可行,但感谢您的帮助


附言:我正在使用Ximpleware在Java中解析相同的内容。也欢迎任何基于java的解决方案。目前,我的java解决方案只提供第一个值,即
value1

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());
}
StringBuilder concatenated=新的StringBuilder():
XPath=XPathFactory.newInstance().newXPath();
字符串表达式=“/test/nodeA/nodeC/text()”;
InputSource InputSource=新的InputSource(“sample.xml”);
NodeList节点=(NodeList)xpath.evaluate(表达式,inputSource,XPathConstants.NODESET);
对于(int i=0;i
XPath将返回一个
节点列表
,您可以对其进行迭代和连接:

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());
}
StringBuilder concatenated=新的StringBuilder():
XPath=XPathFactory.newInstance().newXPath();
字符串表达式=“/test/nodeA/nodeC/text()”;
InputSource InputSource=新的InputSource(“sample.xml”);
NodeList节点=(NodeList)xpath.evaluate(表达式,inputSource,XPathConstants.NODESET);
对于(int i=0;i
下面是一个groovy实现(两行代码!),使用

输出

value1value2

我不在生产代码中使用groovy,但在本地使用groovy非常好。我通常在构建文件中有一些groovy实用程序

输出

value1value2

我不在生产代码中使用groovy,但在本地使用groovy非常好。我经常在构建文件中使用很少的groovy实用程序。

如果希望单个XPath表达式返回包含所选值串联的字符串,则需要XPath 2.0(或更高版本)和XQuery 1.0(或更高版本),在这里可以执行
字符串连接(/test/nodeA/nodeC.)
。XPath 1.0不具备为您提供字符串的表达能力,但当然,正如另一个答案中所示,您可以在所选节点上进行迭代,并用Java等主机语言连接所选值。

如果您希望单个XPath表达式返回包含所选值连接的字符串,则需要XPath 2.0(或更高版本)和XQuery 1.0(或更高版本),其中可以执行
字符串连接(/test/nodeA/nodeC'))
。XPath 1.0不具备为您提供字符串的表达能力,但当然,正如另一个答案中所示,您可以在选定的节点上迭代,并用Java等宿主语言连接选定的值。

这就是我使用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());
     }

}

这就是我将如何使用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());
     }

}

谢谢,这为我指明了正确的方向。现在开始工作了!谢谢,这为我指明了正确的方向。现在开始工作了!非常感谢。总是喜欢groovy解决方案的简单性,但我现在不能使用它。。。groovy有它的位置。。。我只是不确定它是否属于生产代码。很好,谢谢你。总是喜欢groovy解决方案的简单性,但我现在不能使用它。。。groovy有它的位置。。。我只是不确定它是否属于生产代码。不过对于测试来说很棒