如果父节点满足条件,则在子节点中添加XML元素

时间:2015-10-15 17:18:38

标签: java xml dom

对于XML专家,我有一个非常简单的问题。 我想在tuple_centre_name旁边添加一个新元素,使用相同的标记和不同的值,仅当用户名具有我想要的值时,以及另一个具有相同值的tuple_centre_name amministrazione , 不存在。 我问你,因为我发现很难找到该元素,检查是否存在另一个tuple_centre_name并且然后检查父属性

我在JAVA中使用DOM。 谢谢你的帮助。

 <?xml version="1.0" encoding="UTF-8" standalone="no"?><accounts>
    <account>
        <username>fabio</username>
        <password>123456</password>
        <node>
            <tuple_centre_name>amministrazione</tuple_centre_name>
            <port>NP</port>
        </node>
    </account>

此处显示了示例。请求:仅当名为something else的元素中尚不存在时,才添加名为fabio的新tuple_centre_name。这是我想要的结果:

 <?xml version="1.0" encoding="UTF-8" standalone="no"?><accounts>
    <account>
        <username>fabio</username>
        <password>123456</password>
        <node>
            <tuple_centre_name>amministrazione</tuple_centre_name>
            <tuple_centre_name>Something else</tuple_centre_name> //ok because `fabio` as username is fine for me
            <port>NP</port>     
        </node>
    </account>

1 个答案:

答案 0 :(得分:0)

你想要XPath

Document document = /* ... */;

final String username = "fabio";

XPathVariableResolver resolver = new XPathVariableResolver() {
    @Override
    public Object resolveVariable(QName varName) {
        return varName.getLocalPart().equals("user") ? username : null;
    }
};

Element newElement = document.createElement("tuple_centre_name");
newElement.appendChild(document.createTextNode("amministraione"));

XPath xpath = XPathFactory.newInstance().newXPath();
xpath.setXPathVariableResolver(resolver);

Node tupleCentreNameNode = (Node) xpath.evaluate(
    "//account[username[text()=$user]]/node/tuple_centre_name",
    document,
    XPathConstants.NODE);

tupleCentreNameNode.getParentNode().insertBefore(newElement,
    tupleCentreNameNode.getNextSibling());

XPath通常看起来像一个目录路径,这是account/node/tuple_centre_name部分的来源。开头的两个斜杠(//account)表示&#34;任何帐户元素,文档深处的任意数量的级别。&#34;

account[username[text()=$user]]选择器表示&#34;一个帐户元素,其中包含一个用户名元素,其文本与XPath变量&#39; user&#39;。&#39;。可以使用XPathVariableResolver在外部定义XPath变量。虽然可以在XPath表达式中对用户名值进行硬编码,但您需要转义各种字符,包括XML中特殊的引号和字符;将用户名作为XPath变量传递保证它是正确的。