我正在使用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());
    }
}

10-08 00:03