Problem beim löschen von ChildNodes aus einem XML-DOM

Status
Nicht offen für weitere Antworten.

binärbär

Mitglied
Hallo!

Ich versuche mich nun schon ewig im löschen von einigen Child-Knoten aus einem XML Dokument. Ich verwende als DOM das "org.w3c.dom.Document" und nutze den Standard Parser (nicht JDOM).

hier mal die XML Struktur:
[XML]
<root>
<node status="status">
<node_A>Name A</node_A>
<node_B>Beschreibung</node_B>
<node_C>Ein Text</node_C>
<node_D>Irgendwas...</node_D>
<subNode status="status">
<subA>text</subA>
<subB>text</subB>
<subC>text</subC>
</subNode>
<subNode status="status">
<subA>text</subA>
<subB>text</subB>
<subC>text</subC>
</subNode>
<subNode status="status">
<subA>text</subA>
<subB>text</subB>
<subC>text</subC>
</subNode>
</node>
<node status="status">
<node_A>Name B</node_A>
<node_B>Beschreibung</node_B>
<node_C>Ein Text</node_C>
<node_D>Irgendwas...</node_D>
<subNode status="status">
<subA>text</subA>
<subB>text</subB>
<subC>text</subC>
</subNode>
<subNode status="status">
<subA>text</subA>
<subB>text</subB>
<subC>text</subC>
</subNode>
<subNode status="status">
<subA>text</subA>
<subB>text</subB>
<subC>text</subC>
</subNode>
</node>
</root>
[/XML]

Ich möchte z.B. alle SubNodes löschen, die zum Element "<node status="status">" gehören und diese wiederum die Untermenge von "Name B" vom Element <node_A> sind.
Und genau da liegt mein Problem... ich bekomme die Subnodes zu einem bestimmten übergeordneten Knoten nicht vollständig gelöscht. :autsch:

Mein Quelltext bisher:
Java:
Element root = document.getDocumentElement();
Element parent;
NodeList nl = root.getElementsByTagName("node_A");
    for (int i = 0; i < nl.getLength(); i++) {
        Element e = (Element)nl.item(i);
		//alle subNodes vom Knoten "Name B" sollen gelöscht werden 
        if(e.getTextContent().equals("Name B")){
            parent = (Element)e.getParentNode();
            NodeList nl1 = parent.getElementsByTagName("subNode");
            for (int j = 0; j < nl1.getLength(); j++) {
					Element el = (Element)nl1.item(j);
                    if(null != el && el.hasChildNodes()){
							parent = (Element)el.getParentNode();
							parent.removeChild(el);
                    }
            }
        }
    }

Wenn ich die Childs so versuche zu löschen, werden zwar ein paar Childs entfernt aber es bleiben immer noch welche übrig???:L

Hat vielleicht jemand eine Idee, wie ich dies bewerkstelligen kann??

Vielen Dank!

PS: Hier mal ein Ausschnitt zum testen:
Java:
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.xml.sax.SAXException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;


public class ParserTestClass {
    private Document document;
    private String datei        = "C:\\Temp\\XML-Datei.xml";

    public ParserTestClass(){
        try {
            File file = new File(datei);

            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setValidating(false); //erzeugt ein nicht validiertes Document
            DocumentBuilder docBuilder = factory.newDocumentBuilder();
            document = docBuilder.parse(file);
        } catch (SAXException ex) {
            ex.printStackTrace();

        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ParserConfigurationException ex) {
            ex.printStackTrace();
        }

    }
    public void printDOM(){
        //TransformerFactory erzeugen
        TransformerFactory tf = TransformerFactory.newInstance();

        //Einrückungstiefe definieren
        tf.setAttribute("indent-number", new Integer(3));
        Transformer t = null;
        try {
            //eine neue Transformer Instanz erzeugen
            t = tf.newTransformer();

            //Parameter setzen: Einrücken
            t.setOutputProperty(OutputKeys.INDENT, "yes");
            //Ausgabe-Typ: XML
            t.setOutputProperty(OutputKeys.METHOD, "xml");
            //Content-Type
            t.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");

         // Transformation durchführen und Ergebnis in einen Stream speichern
         t.transform(new DOMSource(document),
            new StreamResult(
               new OutputStreamWriter(System.out)));

        } catch (TransformerConfigurationException ex) {
            ex.printStackTrace();
        } catch (TransformerException ex) {
            ex.printStackTrace();
        }

    }

    public void deleteSubNodes(String nodeValue) {
        //TODO das löschen funktioniert noch nicht...
        Element root = document.getDocumentElement();
        Element parent;
        NodeList nl = root.getElementsByTagName("node_A");
        for (int i = 0; i < nl.getLength(); i++) {
            Element e = (Element)nl.item(i);
            if(e.getTextContent().equals(nodeValue)){
                parent = (Element)e.getParentNode();
                NodeList nl1 = parent.getElementsByTagName("subNode");
                for (int j = 0; j < nl1.getLength(); j++) {
                        Element el = (Element)nl1.item(j);
                        if(null != el && el.hasChildNodes()){
                            parent = (Element)el.getParentNode();
                            parent.removeChild(el);
                        }
                    }

                return;
            }
        }
    }
        /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                ParserTestClass myClass = new ParserTestClass();
                myClass.printDOM();
                System.out.println("------------------------------");
                myClass.deleteSubNodes("Name B");
                myClass.printDOM();

            }
        });
    }

}
 

dagmar

Mitglied
Hi,
ich habe zwar noch nie DOM direkt verwendet, was mir aber in Deinem Code aufgefallen ist: Warum biegst Du in der letzten Schleife den parent noch mal um?
Java:
parent = (Element)el.getParentNode();
Du hast den korrekten Parent schon oben in der Hand. Vielleicht hat das ja einen Effekt?
Gruß
dagmar
 

binärbär

Mitglied
Hi Dagmar,

ich habe das mal wieder ausgeklammert und es mit dem parent aus der ersten Schleife versucht, was leider genau den selben Effekt hat, dass teilweise die Childs gelöscht werden und andere noch erhalten bleiben...:(

Also noch mal zum veranschaulichen:
[Java]
for (int j = 0; j < nl1.getLength(); j++) {
Element el = (Element)nl1.item(j);
if(null != el && el.hasChildNodes()){
//parent = (Element)el.getParentNode();
parent.removeChild(el);
}
[/Java]

Das komische ist, in der NodeList ist genau die Anzahl der Elemente vorhanden, die ich auch tatsächlich löschen möchte, nur ist ein Teil davon NULL... deshalb hab ich noch die prüfung auf NULL mit in der Abfrage... es kommt sonst zur NullPointerEx.
 

binärbär

Mitglied
Ok, nach langem rumprobieren hab ich nun die Lösung gefunden... ich war schon nahe dran...
Also, wen es noch interessieren sollte:
Die NodeList wird dynamisch angepasst also muss ich die Schleife etwas abändern...
Java:
Element root = document.getDocumentElement();
Element parent;
NodeList nl = root.getElementsByTagName("node_A");
    for (int i = 0; i < nl.getLength(); i++) {
        Element e = (Element)nl.item(i);
        //alle subNodes vom Knoten "Name B" sollen gelöscht werden 
        if(e.getTextContent().equals("Name B")){
            parent = (Element)e.getParentNode();
            NodeList nl1 = parent.getElementsByTagName("subNode");
//Hier der geänderte Abschnitt:
                while ( nl1.getLength()>0) {
                        Element el = (Element)nl1.item(0);
                        parent.removeChild(el);
                }
            }
        }
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Read / write Problem beim ByteStrom XML & JSON 2
whitenexx Problem beim parsen von Facebook XML XML & JSON 3
G Problem beim schreiben von XML in eine File XML & JSON 2
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
T Problem beim Parsen von Attribut xmlns="urn:com:test&qu XML & JSON 6
J Problem beim XML-Lesen XML & JSON 2
N jdom problem beim lesen von child elementen XML & JSON 5
G DOCTYPE Problem beim Transformer/TransformerFactory etc. XML & JSON 13
P Problem beim erstellen eines neuen Elements (JDOM) XML & JSON 5
S Problem beim Erstellen eines pdfs XML & JSON 3
R Problem beim Auslesen von Attributen XML & JSON 4
O XPATH Problem - Anfänger XML & JSON 4
so_ein_Komischer Problem mit Clean and Build XML & JSON 1
P JAXB-Problem XML & JSON 1
W Problem mit dem mit XML sortierung XML & JSON 2
S Jaxb Unmarshalling Problem XML & JSON 4
E einfaches Problem XML + XSD + jedit XML & JSON 2
S Xslt Problem XML & JSON 2
B JasperReport Problem in Runtime XML & JSON 2
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
R Problem bei: XML und XSL zu HTML XML & JSON 2
M XML write Problem zweiter Ansatz XML & JSON 3
M XML read Problem XML & JSON 4
M XML write Problem XML & JSON 2
M XML Unicode Problem XML & JSON 2
S XJC --> Java-Objects compile Problem XML & JSON 4
F XPath-Problem mit DOM4J XML & JSON 8
B JPA + JAXB Mapping Problem XML & JSON 2
T XPath Problem: finden einer Node nach Attributswert XML & JSON 2
S Encoding Problem XML & JSON 7
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
M JExcelAPI (JXL) Encoding Problem XML & JSON 11
S DOM Parsen Problem mit HTML Sonderzeichen XML & JSON 4
A aus xml --> html Problem XML & JSON 3
Y stax Problem XML & JSON 3
slawaweis Problem mit XSLT (wahrscheinlich ein Bug in Java 6) XML & JSON 16
P XPath Problem XML & JSON 2
M Problem mit FOP in Java Programm XML & JSON 2
S Problem mit XPath XML & JSON 4
J Problem mit compile einer XSD XML & JSON 3
N problem bei xml lesen mit jdom XML & JSON 2
A XPath Problem XML & JSON 2
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
G Problem mit XML-Schema Validierung mit Java XML & JSON 12
B jdom: getChildren() problem XML & JSON 4
H XSL-FO Problem mit If XML & JSON 2
loadbrain XPath Problem XML & JSON 2
T addContent / Problem mit Variable XML & JSON 2
F Problem mit JAXB Unmarshaller XML & JSON 2
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
8 SAXParser Problem, startElement wird nicht ausgeführt XML & JSON 2
M Java und XSLT: Performanz-Problem XML & JSON 5
X JDOM SAXBuilder Validationschema - Problem XML & JSON 8
G Problem mit getContent XML & JSON 4
K stax problem XML & JSON 2
S Problem mit SAX XML & JSON 6
A Problem mit JasperReport XML & JSON 6
C XSD Problem XML & JSON 16
R Problem bei Erstellung von XML(JDOM) XML & JSON 3
R Problem mit SAX-Parser characters() XML & JSON 7
M XPath Problem im Zusammenhang mit document() XML & JSON 2
Z Problem mit getNodeValue() und setNodeValue() in DOM XML & JSON 6
H JAXB CUSTOMIZATION PROBLEM XML & JSON 2
M XPATH und RSS (Problem namespaces) XML & JSON 7
P SAXParser problem? XML & JSON 2
V Problem mit xsd XML & JSON 2
P XML mit hilfe von JDOM abspeichern macht Problem XML & JSON 6
G Problem mit addContent() XML & JSON 4
B DTD Problem - Reihenfolge der Einträge XML & JSON 2
K Problem mit ant/java web services XML & JSON 4
K xml Datei mit JDOM erzeugen, Problem Namespaces XML & JSON 1
P Problem mit XML und DOM XML & JSON 2
W Ungleiches Escaping beim Marshalling XML & JSON 8
S Hilfe beim RDF-Graphen XML & JSON 0
R Beim Serialisieren fehlt die letzte Zeile XML & JSON 5
N Probleme bei der Formatierung beim Einfügen und löschen über DOM XML & JSON 7
A Leeres Array beim Auslesen von XML-Datei XML & JSON 4
L Jackson JSON: Probleme beim einlesen XML & JSON 1
A XML-Fehler beim Prefix von xmlns XML & JSON 2
K Beim Parsen einer XML-Datei Connection timed out XML & JSON 4
G Langsam beim SAX-Parsen - woran liegts? XML & JSON 2
A Fehler beim Erzeugen eines XML-Schema XML & JSON 4
B Validierung nur beim einlesen oder auch beim schreiben? XML & JSON 4
D JAXBException beim Marshaller XML & JSON 4
J Dateinamen beim Start auslesen XML & JSON 8
F Hilfe beim bearbeiten von XML elemente XML & JSON 3
N XStream ConversionException beim Deserialisieren in (Hibernate)Objekt XML & JSON 6
hdi Probleme beim Erstellen einer XML XML & JSON 7
F Probleme beim html parsen mit tagsoup XML & JSON 4
M Probleme beim Parsen eines gefilterten XML-Dokuments XML & JSON 6
L Reihenfolge beim xml Datei parsen einhalten? XML & JSON 8
H JAXB Probleme beim Unmarshalling XML & JSON 3
sylo Beim Erzeugen einer XML Datei auch die XML Struktur erzeugen? XML & JSON 11
N Hilfe beim Einstieg in EMF XML & JSON 6
D Das Programm hängt etwa 5 Sekunden beim Aufruf der parse-Methode XML & JSON 6
D Tabs/Einrückungen der XML-Elemente gehen beim Schreiben verloren XML & JSON 5
G XML Tag beim Einlesen manipulieren XML & JSON 2
S Probleme beim erstellen einer Jar XML & JSON 12
P NullPointerException beim Auslesen XML & JSON 8
M Performance beim Binding XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben