我有一个xml文档,如下所示:
<xmlList>
<Phone>
<Prefix>04</Prefix>
</Phone>
<Phone>
<Prefix>04</Prefix>
</Phone>
<Phone>
<Prefix>03</Prefix>
</Phone>
</xmlList>
如果是Prefix
,我想检索04
节点内容。
String xml = "<xmlList><Phone><Prefix>04</Prefix></Phone><Phone><Prefix>04</Prefix></Phone><Phone><Prefix>03</Prefix></Phone></xmlList>";
XPathFactory xpathFactory = XPathFactory.newInstance();
XPath xpath = xpathFactory.newXPath();
InputSource source = new InputSource(new StringReader(xml));
// only one string is returned
String prefix = xpath.evaluate("/xmlList/Phone/Prefix", source);
只从xpath.evaluate
检索到一个字符串
我想得到一个包含给定XML中所有04次出现的列表。
可能的?
答案 0 :(得分:2)
正如您在文档https://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/XPath.html#evaluate%28java.lang.String,%20org.xml.sax.InputSource%29中看到的那样,evaluate
方法的重载会评估XPath并将结果作为字符串返回。与XPath 1.0一样,一组节点的字符串值是节点集中第一个节点的字符串值,您将获得一个包含第一个选定节点内容的字符串。
因此,您需要使用不同的重载,您可以将结果类型指定为NODESET,然后您可以迭代返回的NodeList以收集值。
或考虑切换到XPath 2.0或3.0或XQuery 1.0或3.0实现,如Saxon 9,然后有API返回一系列字符串,例如: /xmlList/Phone/Prefix/string()
。您需要使用不同的API,而不是以XPath 1.0为中心的JAXP XPath API。