Java 如何提取XPath指向的所有值?
我有下面的xmlJava 如何提取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>
<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有它的位置。。。我只是不确定它是否属于生产代码。不过对于测试来说很棒