这是我的xml文件。
- <deviceparameters>
- <parameter componenttype="TextBox">
<name>Operating Type</name>
<oid>1.3.6.1.4.1.31163.5.1.1</oid>
<writable>true</writable>
<description>The operating type defines which waveform type is used. This configuration takes several seconds to execute</description>
- <paramvalues type="Integer">
<value default="No">123</value>
</paramvalues>
</parameter>
- <parameter componenttype="TextBox">
<name>Active Waveform Status</name>
<oid>1.3.6.1.4.1.31163.5.1.2</oid>
<writable>false</writable>
<description>Show the status of the waveform configured by operatingType</description>
- <paramvalues type="String">
<value default="yes">Active</value>
</paramvalues>
</parameter>
</deviceparameters>
我想删除名为“Active wavwform Status
”的节点。如何从xml中重新启动该特定节点。
我写的代码如下。
rootElement = doc.getDocumentElement();
NodeList nList = doc.getElementsByTagName("parameter");
String nodeName = TF_name.getText();
System.out.println(""+nList.getLength());
for (int temp = 0; temp < nList.getLength();temp++)
{
Node nNode = nList.item(temp);
Element eElement = (Element) nNode;
String upname1 = getTagValue("name", eElement);
if(upname1.equals(nodeName))
{
System.out.println("Parent: "+nNode.getParentNode().getNodeName());
System.out.println("nodename: "+nNode.getNodeName());
System.out.println("rmoving ....");
rootElement.removeChild(nNode);
System.out.println("removed...");
}
}
答案 0 :(得分:0)
您可以使用DocumentTraversal,NodeIterator删除节点。
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse("/home/riddhish/developerworkspace/SplitString/src/com/updatexmlwithjava/file.xml");
DocumentTraversal traversal = (DocumentTraversal) doc;
Node a = doc.getDocumentElement();
System.out.println("Current File Content");
NodeIterator iterator = traversal.createNodeIterator(a, NodeFilter.SHOW_ELEMENT, null, true);
Element b = null;
for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {
Element e = (Element) n;
if ("parameter".equals(e.getTagName())) {
System.out.println(""+e.getTagName() +" "+ e.getTextContent());
b = e;
} else if ("name".equals(e.getTagName()) && "Active Waveform Status".equals(e.getTextContent()) && b != null) {
b.removeChild(e);
}
}
将新内容写入文件
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(new File("/home/riddhish/developerworkspace/SplitString/src/com/updatexmlwithjava/file.xml"));
iterator = traversal.createNodeIterator(a, NodeFilter.SHOW_ELEMENT, null, true);
b = null;
doc = docBuilder.newDocument();
Element rootElement = doc.createElement("deviceparameters");
doc.appendChild(rootElement);
for (Node n = iterator.nextNode(); n != null; n = iterator.nextNode()) {
Element e = (Element) n;
rootElement.appendChild(doc.importNode(n, true));
}
transformer.transform(source, result);
答案 1 :(得分:0)
这是关于如何删除节点的建议,包括打印。您必须处于正确的上下文中,如果要删除的节点未附加到根,则无法将其删除,就像您尝试的那样。找到节点,获取其父节点并从父节点中删除它。 removeNode方法是重要的部分:
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class RemoveNodestuff
{
Document doc;
public RemoveNodestuff(String filename) throws ParserConfigurationException, SAXException,
IOException
{
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
doc = builder.parse(new File(filename));
print(doc.getDocumentElement());
}
public void removeNode(String tagName, String value)
{
NodeList nl = doc.getElementsByTagName(tagName);
if (nl != null)
{
for (int i = 0; i < nl.getLength(); i++)
{
Element item = (Element) nl.item(i);
if (item.getTextContent().equals(value))
{
item.getParentNode().removeChild(item);
}
}
}
print(doc.getDocumentElement());
}
private void print(Node n)
{
NodeList nl = n.getChildNodes();
if (nl != null)
{
for (int i = 0; i < nl.getLength(); i++)
{
Node item = nl.item(i);
if (item.getNodeType() == Node.ELEMENT_NODE)
{
System.out.println(item.getNodeName() + " " + item.getFirstChild().getNodeValue());
if (item.hasChildNodes())
{
print(item);
}
}
}
}
}
public static void main(String[] args) throws ParserConfigurationException, SAXException,
IOException
{
RemoveNodestuff removeNodestuff = new RemoveNodestuff(
args[0]);
removeNodestuff.removeNode("name", "Active Waveform Status");
}
}
答案 2 :(得分:0)
我得到了答案 实际上我是从我的xml文件中删除节点,但我没有将它写入我的xml文件 我错过了以下部分
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(selectedFile);
transformer.transform(source, result);
经过长时间的代码研究,我发现了这个愚蠢的错误,所以我更正了。
无论如何,谢谢你的回复。