我正在使用Java XPathFactory从一个简单的xml文件获取值:
<Obama>
<coolnessId>0</coolnessId>
<cars>0</cars>
<cars>1</cars>
<cars>2</cars>
</Obama>
使用xpression
//Obama/coolnessId | //Obama/cars
的结果是:0
0
1
2
从这个结果,我无法区分什么是coolnessId和什么是汽车ID。我需要类似的东西:
CoolnessId: 0
CarId: 0
CarId: 1
CarId: 2
使用
concat('c_id: ', //Obama/coolnessId,' car_id: ',//Obama/cars)
可以解决问题,但是concat不能用于值列表。不幸的是,我不能使用字符串连接,因为它在我的xpath库中似乎是未知的。而且我无法处理给定的xml。
我还能使用什么其他技巧来获取带有别名的值列表?
最佳答案
如果选择元素而不是文本内容,则将具有一些上下文:
public static void main(String[] args) throws Exception {
String xml =
"<Obama>" +
" <coolnessId>0</coolnessId>" +
" <cars>0</cars>" +
" <cars>1</cars>" +
" <cars>2</cars>" +
"</Obama>";
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
Document doc = factory.newDocumentBuilder().parse(new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)));
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile("//Obama/cars | //Obama/coolnessId");
NodeList result = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < result.getLength(); i++) {
Element item = (Element) result.item(i);
System.out.println(item.getTagName() + ": " + item.getTextContent());
}
}