XPath:如何使用第二个子节点的值选择子节点

时间:2018-08-03 16:48:33

标签: java xml xpath

我在xml中有这样的数据:

<?xml version="1.0" encoding="UTF-8"?>
<xmlroot>
    <groups>
        <group>
            <object>
                <symbol>O.01</symbol>
                <name>object 1</name>
                <selected>false</selected>
            </object>
            <group>
                <object>
                    <symbol>O.02</symbol>
                    <name>object 2</name>
                    <selected>false</selected>
                </object>
                <group>
                    <object>
                        <symbol>O.03</symbol>
                        <name>object 3</name>
                        <selected>false</selected>
                    </object>
                </group>
            </group>
        </group>
        <group>
            <object>
                <symbol>O.04</symbol>
                <name>object 4</name>
                <selected>false</selected>
            </object>
            <object>
                <symbol>O.05</symbol>
                <name>object 5</name>
                <selected>false</selected>
            </object>
        </group>
    </groups>
</xmlroot>

我想在Java应用程序中对此xml执行以下操作:如果得到特定的对象符号,则应通过在<selected>元素上设置'true'值来标记该对象 即,如果我得到符号值=“ O.03”,则xml片段应如下所示:

                    <object>
                        <symbol>O.03</symbol>
                        <name>object 3</name>
                        <selected>true</selected>
                    </object>

因此,我应该找到具有指示值的元素<symbol>,然后是其父节点,然后是该父节点的子节点<selected>元素-并将其设置为正确的值。 我想这样做,无论<object>标签内嵌套了多少<group>标签,都可以使用它

我尝试使用XPath来做到这一点,就像这样(Java代码):

    XPath xpath = XPathFactory.newInstance().newXPath();
    symbol = "O.03";
    nodepath = "//selected AND /parent::symbol[text()='" + symbol + "']";
    Element e = (Element) xpath.evaluate(nodepath, doc, XPathConstants.NODE); 

但是它不起作用:-(

使用单个.evaluate调用是否有可能?

感谢帮助。

科利

1 个答案:

答案 0 :(得分:1)

  

使用单个.evaluate调用是否有可能?

可以在一次调用中选择该元素。要更改其值,您必须使用另一条指令。

例如,要使用特定符号值从<selected>中选择object元素,请使用

nodepath = "//object[symbol/text()='" + symbol + "']/selected";

计算该表达式后,将(第一个)结果Element的值更改为true