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

Java 如果父节点满足条件,则在子节点中添加XML元素,java,xml,dom,Java,Xml,Dom,我有一个非常简单的问题要问XML专家。 我想在tuple\u center\u name旁边添加一个新元素,具有相同的标记和不同的值,前提是用户名有我想要的值,而另一个tuple\u center\u name具有相同值的amministrazione不存在。 我之所以这样问是因为我发现很难访问该元素,请检查是否存在另一个元组\u中心\u名称,然后检查父属性 我在JAVA中使用DOM。 谢谢你帮助我 <?xml version="1.0" encoding="UTF-8" standal

我有一个非常简单的问题要问XML专家。 我想在
tuple\u center\u name
旁边添加一个新元素,具有相同的标记和不同的值,前提是用户名有我想要的值,而另一个
tuple\u center\u name
具有相同值的
amministrazione
不存在。 我之所以这样问是因为我发现很难访问该元素,请检查是否存在另一个
元组\u中心\u名称
,然后检查父属性

我在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>
您希望为此:

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\u center\u name
部分的来源。开头的两个斜杠(
//account
)表示“任何account元素,文档中任何深度的级别。”

account[username[text()=$user]]
选择器表示“一个account元素,其中包含一个username元素,该元素的文本与XPath变量“user”匹配”。可以使用XPathVariableResolver在外部定义XPath变量。虽然可以在XPath表达式中硬编码用户名值,但需要转义各种字符,包括引号和XML中特殊的字符;将用户名作为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());