2012-03-26 9 views
0

这是我的xml文件。使用java移除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

你有没有得到任何错误?它不起作用吗? – Thilo 2012-03-26 07:14:32

+0

你的代码到底是什么问题? 'getTagValue'方法有一些魔力,我们不知道'TF_name'的值... – 2012-03-26 07:15:28

+0

getTagValue()方法返回节点的标记值。并且TF_name是用户将输入名称以删除节点的文本字段。 – 2012-03-26 07:23:51

回答

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

的代码,我发现这个愚蠢的错误很长一段时间研究,所以我纠正它。
无论如何感谢您的回复。

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); 
+0

不...不工作... – 2012-03-26 11:06:53

+0

它不显示任何错误,但也不会给出所需的输出。 – 2012-03-26 11:07:36

+0

你有没有检查你的控制台输出? – 2012-03-26 11:14:51

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"); 
    } 
}