使用java删除XML的根

时间:2012-03-26 07:06:37

标签: java xml removechild

这是我的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..."); 
    }                   
}                   

3 个答案:

答案 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); 

经过长时间的代码研究,我发现了这个愚蠢的错误,所以我更正了。
无论如何,谢谢你的回复。