PyXML: Textknoten mit Leeraum entfernen?!?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
chris81
User
Beiträge: 3
Registriert: Mittwoch 16. März 2005, 16:48
Wohnort: Jena

Dienstag 22. März 2005, 12:27

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).
BlackJack

Mittwoch 23. März 2005, 00:53

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)
chris81
User
Beiträge: 3
Registriert: Mittwoch 16. März 2005, 16:48
Wohnort: Jena

Donnerstag 24. März 2005, 13:30

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

Donnerstag 24. März 2005, 23:24

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