对于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>
答案 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变量传递保证它是正确的。