Seite 1 von 1

PyXML: Textknoten mit Leeraum entfernen?!?

Verfasst: Dienstag 22. März 2005, 12:27
von chris81
Hab feststellen müssen, dass Leerräume im Dokument als Text-Knoten gesehen werden, das möchte ich irgendwie umgehen. Denn in meiner Anwendung interessieren mich nur die Element-Knoten, die als Kind einen wahren (und nicht leeren) Text-Knoten besitzen - also lasse ich auf mein Dokument folgende rekursive Funktion drauf los:

Code: Alles auswählen

def find(nodeList):
            for subnode in nodeList:
                if subnode.nodeType == subnode.ELEMENT_NODE and
                   subnode.firstChild.nodeType == node.firstChild.TEXT_NODE and 
                   subnode.firstChild.data != "":
                    print "So einen gefunden: " + subnode.tagName + subnode.firstChild.data
                    find(subnode.childNodes)
Nur werden die Leerräume als Text-Knoten immer noch mit berücksichtigt :cry: ....was kann ich tun?!? Vielen Dank euch im voraus!

Edit (Leonidas): Code in Python Tags gesetzt (Auch wenn es einen Syntax Error gibt, wie BlackJack feststellt).

Verfasst: Mittwoch 23. März 2005, 00:53
von BlackJack
Erstmal scheint das kein "echter" Quelltext zu sein, weil die if-Abfrage in der Form einen SyntaxError auslöst. Da fehlen Klammern oder '\' um eine logische Zeile daraus zu machen.

Was heisst bei Dir "Leerraum"? Du testest nur, ob die leere Zeichenkette vorkommt. In folgendem XML-Schnipsel ist zwischen den Tags aber zum Beispiel ein Zeilenende:

Code: Alles auswählen

<node>
</node>
Gib doch mal statt der Zeichenkette, die repr()-Form aus, sonst siehst Du nicht welche Whitespace-Zeichen tatsächlich enthalten sind:

Code: Alles auswählen

print "So einen gefunden: %s: %r" % (subnode.tagName, subnode.firstChild.data)

Verfasst: Donnerstag 24. März 2005, 13:30
von chris81
Danke BlackJack für den Einwand, dass ein Textknoten ja auch nur ein Zeilenende "\n" enthalten kann. Nun habe ich einfach für alle Text-Knoten dies mitüberprüft...und gerate halt so an nur die Element-Knoten mit nichtleeren Text-Knoten als Kinder...aber ob das die einfachste und eleganteste Variante ist, mag ich bezweifeln :?

Code: Alles auswählen

def find(nodeList):
            for subnode in nodeList:
                if ((subnode.nodeType == subnode.ELEMENT_NODE) and
                    (subnode.firstChild.nodeType == subnode.firstChild.TEXT_NODE) and
                    (count(subnode.firstChild.data, "\n") == 0)):
                    print "GEFUNDEN: " + (subnode.tagName + " " + subnode.firstChild.data)
                    ElementNames.append(subnode.tagName)
                    ElementValues.append(subnode.firstChild.data)
                find(subnode.childNodes)

Verfasst: Donnerstag 24. März 2005, 23:24
von BlackJack
Du könntest auf die Zeichenketten auch einfach die strip()-Methode anwenden und testen, ob die leere Zeichenkette übrig bleibt. Damit filterst Du alle Texte die nur aus Whitespace-Zeichen bestehen, also beliebig viele Leerzeichen, Tabulatoren und Zeilenenden.