XML Nodes als Plain Text auslesen

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
enrico
User
Beiträge: 7
Registriert: Montag 30. Januar 2006, 17:00

Hallo,

ich hab folgende XML Strukturen:

Code: Alles auswählen

<body tg-ref="en-admin" headline="Version 1.1">
    <list style="symbols">
        <li>Typos corrected</li>
        <li>German versions of Microsoft Security Bulletins added</li>
    </list>
</body>
Die "body" nodes enthalten mehrere subnodes, deren Aufbau ich nicht kenne (auch wenn das in dem Beispiel anders aussieht ;) ). Ich benötige nun den Text zwischen den beiden Nodes so wie er dort steht.
Ich hab das vorher in C und libxml gemacht, dort war der Text als nodeValue in den Node-Objekten hinterlegt. Hier in Python (mit dem XML Modul und einem DOM-Parser) ist das jedoch anders :(

Meine einzigste Idee wäre jetzt rekursiv durch die child nodes zu gehen, deren Namen und Attribute herzunehmen und daraus wieder einen Text-String basteln. Allerdings ist das nicht wirklich komfortabel und ich bin sicher, dass es da noch eine andere Möglichkeit gibt ;)

Für jegliche Hinweise, Ideen und Anregungen bin ich sehr dankbar :)

Danke, Enrico
BlackJack

Mit dem ElementTree Modul geht so etwas recht einfach. Vorausgesetzt ich habe verstanden was Du machen möchtest.

Code: Alles auswählen

from elementtree.ElementTree import XML, tostring

source = """
<doc>
    <body tg-ref="en-admin" headline="Version 1.1"> 
        <list style="symbols"> 
            <li>Typos corrected</li> 
            <li>German versions of Microsoft Security Bulletins added</li> 
        </list> 
    </body>
    <body tg-ref="en-admin" headline="Version 1.1"> 
        <para>
            Something <strong>completely</strong> different.
        </para>
    </body>
</doc>
"""

root = XML(source)
for body_node in root.findall('body'):
    print body_node.text + '\n'.join(map(tostring, body_node))
    print '-' * 75
enrico
User
Beiträge: 7
Registriert: Montag 30. Januar 2006, 17:00

Hallo,

das ist schonmal eine Idee, allerdings muss ich dann meine ganzen Einleseroutinen erneut auf einen anderen XML Parser umstellen und dann killt mich mein Chef ("Keine weiteren großen Änderungen mehr und keine neuen Module!!") :oops:
Dazu kommt, dass ich versch. nodes habe, die dann erst die body nodes enthalten (d.h. die body nodes sind niemals in der zweiten Ebene in dem Baum, sondern immer drunter). Dein Codeausschnitt würde ja alle body nodes des Dokumentes suchen und zusammenfügen.

Um jetzt den Abschnitt zwischen zwei Body nodes auszulesen und dann mittels ElementTree zu verarbeiten, brauch ich ja auch wieder den reinen Text, stehe also wieder am Anfang :(

Danke, Enrico
BlackJack

enrico hat geschrieben:das ist schonmal eine Idee, allerdings muss ich dann meine ganzen Einleseroutinen erneut auf einen anderen XML Parser umstellen und dann killt mich mein Chef ("Keine weiteren großen Änderungen mehr und keine neuen Module!!") :oops:
ElementTree finden viele Leute einfacher zu handhaben als DOM- und SAX-Parser. Es wird ab Python 2.5 auch zur Standardbibliothek gehören.
Dazu kommt, dass ich versch. nodes habe, die dann erst die body nodes enthalten (d.h. die body nodes sind niemals in der zweiten Ebene in dem Baum, sondern immer drunter). Dein Codeausschnitt würde ja alle body nodes des Dokumentes suchen und zusammenfügen.
Nein, so sucht es nur in der ersten "Unterebene". Wenn man alle 'body'-Nodes im gesamten Unterbaum haben möchte, dann müsste man nach '//body' suchen lassen. `find()`/`findall()` unterstützt ein ganz kleines bischen XPath.
Um jetzt den Abschnitt zwischen zwei Body nodes auszulesen und dann mittels ElementTree zu verarbeiten, brauch ich ja auch wieder den reinen Text, stehe also wieder am Anfang :(
Wieso den reinen Text!? Du brauchst am Anfang mal ein XML-Dokument/-Fragment als Zeichenkette oder in einer Datei. Aber das ist ja bei jedem XML-Parser so.
Antworten