Java 如果父节点满足条件,则在子节点中添加XML元素
我有一个非常简单的问题要问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
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());