我有一个简单的示例xml文件:

<?xml version="1.0" ?>
<testCars>
    <cars id="0">
        <color id="0">Black</color>
        <color id="1">Orange</color>
    </cars>
    <cars id="1">
        <color id="0">Blue</color>
        <color id="1">Grey</color>
    </cars>
    <cars>
        <color id="0>">Red</color>
        <color id="1>">Green</color>
    </cars>
 </testCars>


首先,我使用DocumentBuilder解析该文件,然后使用xpath来获取所需的内容。
我将使用表达式和xpath来获得汽车1的颜色0:

String expression = String.format("/testCars/cars[@id=\"%s\"]/color[@id=\"%s\"]",1,0);
NodeList nodeList = (NodeList) xPath.compile(expression).evaluate(doc, XPathConstants.NODESET);
System.out.println(nodeList.item(0).getTextContent());


我得到了Blue,这是我应该的。但是可以说我想要没有ID的卡的颜色0,应该是红色。

所以我将表达式更改为

String expression = String.format("/testCars/cars/color[@id=\"%s\"]",0);


但是现在结果是布莱克。它只是采用第一个节点,尽管我希望它采用没有任何属性的节点。

Xpath是否具有一些特定命令来显式选择不带属性的节点?还是我需要重构xml文件?

谢谢。

最佳答案

要选择没有属性的cars元素,请使用cars[not(@*)]。要选择没有cars属性的@id元素,请使用cars[not(@id)]

10-04 13:11