Hallo,
ich hab folgendes Problem. Ich möchte eine XML-Datei parsen. Zum Beispiel diese:
Und daraus eine DOM-Struktur (org.w3c.dom) erstellen.
Mein Problem sind nun die "überflüssigen" Whitespaces im Dokument (\n,\t, usw...). Wenn ich das DOM- Dokument einmal in einem "preorder"-Durchlauf durchlaufe sieht eine mögliche Ausgabe so aus:
#document
wurzel
#text <- unerwünschte Whitespaces
element
#text{eins}
#text <- unerwünschte Whitespaces
element
#text{zwei}
#text <- unerwünschte Whitespaces
gewünscht ist aber diese:
#document
wurzel
element
#text{eins}
element
#text{zwei}
Deshalb hab ich mir gedacht das ich einfach alle Textelemente die nur Whitespaces enthalten lösche. Und habe mir folgende Methode geschrieben:
Doch leider funktioniert diese Methode nicht. Nachdem ich den ersten #test{whitespace} Knoten gelöscht habe wird mir bei weiteren Schleifendurchläufen der Schleife über die Kinder das #test- Objekt über item(i) zurückgegeben, das ich eigetlich gelöscht habe. Wo ist mein Denkfehler?
Kann man die Whitespaces irgendwie anders entfernen. Auf die Funktion factory.setIgnorableElementContentWhitespace(false); kann ich nicht zurückgreifen da diese wohl immer eine DTD oder ein XML-Schema benötigt?! Manchmal stehen diese bei meinen Anwendungsfällen nicht zur Verfügung.
Könnte man evtl. die Datei als String einlesen und alle Whitespaces(bzw. alle die alleinig zwischen ">" und "<" stehen ) entfernen?
Der XML-Input wird später relativ umfangreich -bis zu 100000 Elemente. Wie könnte man das die Whitespaces bzw. die Whitespace- Text- Elemente effektiv entfernen?
ich hab folgendes Problem. Ich möchte eine XML-Datei parsen. Zum Beispiel diese:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<wurzel>
<element>eins</element>
<element>zwei</element>
</wurzel>
Und daraus eine DOM-Struktur (org.w3c.dom) erstellen.
Mein Problem sind nun die "überflüssigen" Whitespaces im Dokument (\n,\t, usw...). Wenn ich das DOM- Dokument einmal in einem "preorder"-Durchlauf durchlaufe sieht eine mögliche Ausgabe so aus:
#document
wurzel
#text <- unerwünschte Whitespaces
element
#text{eins}
#text <- unerwünschte Whitespaces
element
#text{zwei}
#text <- unerwünschte Whitespaces
gewünscht ist aber diese:
#document
wurzel
element
#text{eins}
element
#text{zwei}
Deshalb hab ich mir gedacht das ich einfach alle Textelemente die nur Whitespaces enthalten lösche. Und habe mir folgende Methode geschrieben:
Code:
public static void removeWhiteSpaces(Node node)
{
System.out.println(node.getNodeName());
if(node.hasChildNodes())
{
NodeList childs = node.getChildNodes();
for(int i=0;i<childs.getLength();i++)
{
Node child = childs.item(i);
if (child.getNodeType() == Node.TEXT_NODE
&& child.getNodeValue().matches("^\\s*$")
&& child.getParentNode() != null)
{
child.getParentNode().removeChild(child);
}
else
{
removeWhiteSpaces(child);
}
}
}
}
Doch leider funktioniert diese Methode nicht. Nachdem ich den ersten #test{whitespace} Knoten gelöscht habe wird mir bei weiteren Schleifendurchläufen der Schleife über die Kinder das #test- Objekt über item(i) zurückgegeben, das ich eigetlich gelöscht habe. Wo ist mein Denkfehler?
Kann man die Whitespaces irgendwie anders entfernen. Auf die Funktion factory.setIgnorableElementContentWhitespace(false); kann ich nicht zurückgreifen da diese wohl immer eine DTD oder ein XML-Schema benötigt?! Manchmal stehen diese bei meinen Anwendungsfällen nicht zur Verfügung.
Könnte man evtl. die Datei als String einlesen und alle Whitespaces(bzw. alle die alleinig zwischen ">" und "<" stehen ) entfernen?
Der XML-Input wird später relativ umfangreich -bis zu 100000 Elemente. Wie könnte man das die Whitespaces bzw. die Whitespace- Text- Elemente effektiv entfernen?