如何在 Java 中使用 xpath 编辑/更新 XML 文件中的节点
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6511780/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How do I edit/update a node in an XML file using xpath in Java
提问by stackoverflow
Java Code:
Java代码:
public void update(String id) throws Exception
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(file_);
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
XPathExpression expr = xpath.compile("Servers/server[@ID=" + id + "]");
Node nodeGettingChanged = (Node) expr.evaluate(doc, XPathConstants.NODE);
//HELP START
//? ? ? How do get the node/elements guts to alter that guy
//HELP END
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file_);
transformer.transform(source, result);
}
XML BEFORE
之前的 XML
<Servers>
<server ID="12234"> // <-- I want to change this node
<name>Greg</name>
<ip>127.0.0.1</ip>
<port>1897</port>
</server>
<server ID="42234">
<name>Bob</name>
<ip>127.0.0.1</ip>
<port>1898</port>
</server>
<server ID="5634">
<name>Tom</name>
<ip>127.0.0.1</ip>
<port>1497</port>
</server>
</Servers>
XML AFTER
之后的 XML
<Servers>
<server ID="12234"> // <-- This guy is now changed
<name>SomethingElse</name>
<ip>localHost</ip>
<port>4447</port>
</server>
<server ID="42234">
<name>Bob</name>
<ip>127.0.0.1</ip>
<port>1898</port>
</server>
<server ID="5634">
<name>Tom</name>
<ip>127.0.0.1</ip>
<port>1497</port>
</server>
</Servers>
回答by Grzegorz Szpetkowski
Probably not best-effective code, but it works (avoiding text elements).
可能不是最有效的代码,但它有效(避免文本元素)。
NodeList childNodes = nodeGettingChanged.getChildNodes();
for (int i = 0; i != childNodes.getLength(); ++i)
{
Node child = childNodes.item(i);
if (!(child instanceof Element))
continue;
if (child.getNodeName().equals("name"))
child.getFirstChild().setNodeValue("SomethingElse") ;
else if (child.getNodeName().equals("ip"))
child.getFirstChild().setNodeValue("localHost") ;
else if (child.getNodeName().equals("port"))
child.getFirstChild().setNodeValue("4447") ;
}
Output changed XML fragment:
输出更改的 XML 片段:
<server ID="12234">
<name>SomethingElse</name>
<ip>localHost</ip>
<port>4447</port>
</server>
回答by Andrey Adamovich
You can try this:
你可以试试这个:
NodeList children = nodeGettingChanged.getChildNodes();
chidren.item(0).setNodeValue("SomethingElse");
chidren.item(1).setNodeValue("localHost");
chidren.item(2).setNodeValue("4447");
回答by Jim Garrison
Take a look at Node#getFirstChild()
and Node#getNextSibling()
to iterate over child nodes. Also remember that text nodes are present between elements as well and you have to ignore them if you don't want them.
查看Node#getFirstChild()
并Node#getNextSibling()
迭代子节点。还要记住,元素之间也存在文本节点,如果您不想要它们,则必须忽略它们。