2012-03-26 6 views
0

Dies ist meine XML-Datei.Entfernen Sie ein untergeordnetes XML-Stammverzeichnis mit Hilfe von Java

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

Ich möchte Knoten mit dem Namen 'Active wavwform Status' entfernen. Wie kann ich diesen bestimmten Knoten aus XML neu erstellen?

Der Code, den ich geschrieben habe, ist unten.

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

Und haben Sie irgendwelche Fehler bekommen? Funktioniert es nicht? – Thilo

+0

Was genau ist das Problem mit Ihrem Code? Es gibt etwas Magie in der 'getTagValue' Methode und wir kennen den Wert von' TF_name' nicht ... –

+0

getTagValue() Methode gibt den Tag Wert des Knotens zurück. Und TF_name ist ein Textfeld, in dem der Benutzer einen Namen zum Löschen des Knotens eingibt. –

Antwort

0

Ich habe die Antwort bekommen.
Eigentlich löschte ich den Knoten aus meiner XML-Datei, aber ich schrieb es nicht in meine XML-Datei.
Ich war

Teil folgende fehlende
TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
Transformer transformer = transformerFactory.newTransformer(); 
DOMSource source = new DOMSource(doc); 
StreamResult result = new StreamResult(selectedFile); 
transformer.transform(source, result); 

Nach langer Zeit Studium der Code, den ich diesen dummen Fehler gefunden, so dass ich korrigiert sie.
Trotzdem vielen Dank für Ihre Antwort.

0

Sie können Knoten mithilfe von DocumentTraversal, NodeIterator entfernen.

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

Um neue Inhalte in die Datei

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

Nein ... es funktioniert nicht ... –

+0

es zeigt keinen Fehler, aber auch nicht die erforderliche Ausgabe .. –

+0

haben Sie Ihre Konsole Ausgabe überprüfen? –

0

Dies ist mein Vorschlag auf zu schreiben, wie ein Knoten zu entfernen, einschließlich Druck. Sie müssen sich im richtigen Kontext befinden, wenn der zu entfernende Knoten nicht mit dem Stamm verknüpft ist, können Sie ihn nicht entfernen, wie Sie es versuchen. Suchen Sie den Knoten, rufen Sie seinen übergeordneten Knoten ab und entfernen Sie ihn aus dem übergeordneten Knoten. Die removeNode-Methode ist der wichtige Teil:

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