如何提取 XPath 指向的所有值?
How to extract all values pointed to by an XPath?
我有以下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
XPath 将 return 一个 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());
}
这是一个 groovy 实现(2 行代码!)使用 XmlSlurper
def xml = new groovy.util.XmlSlurper().parse(new File('sample.xml'))
print xml.nodeA*.nodeC.join("")
产出
value1value2
我不在生产代码中使用 groovy 但对于本地处理来说它很棒。 gradle 构建文件中经常有很少的 groovy 实用程序。
如果您希望单个 XPath 表达式 return 具有所选值串联的字符串,那么您需要分别使用 XPath 2.0(或更高版本)XQuery 1.0(或更高版本),您可以在其中执行 string-join(/test/nodeA/nodeC, '')
. XPath 1.0 没有为您提供字符串的表达能力,但当然,正如另一个答案中所示,您可以遍历选定的节点并以 Java.[=11 等宿主语言连接选定的值=]
这就是我使用 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());
}
}
我有以下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
XPath 将 return 一个 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());
}
这是一个 groovy 实现(2 行代码!)使用 XmlSlurper
def xml = new groovy.util.XmlSlurper().parse(new File('sample.xml'))
print xml.nodeA*.nodeC.join("")
产出
value1value2
我不在生产代码中使用 groovy 但对于本地处理来说它很棒。 gradle 构建文件中经常有很少的 groovy 实用程序。
如果您希望单个 XPath 表达式 return 具有所选值串联的字符串,那么您需要分别使用 XPath 2.0(或更高版本)XQuery 1.0(或更高版本),您可以在其中执行 string-join(/test/nodeA/nodeC, '')
. XPath 1.0 没有为您提供字符串的表达能力,但当然,正如另一个答案中所示,您可以遍历选定的节点并以 Java.[=11 等宿主语言连接选定的值=]
这就是我使用 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());
}
}