2016-05-13 6 views
1

Ich habe folgende XML-Quelle.Python XML-Parser erhält nicht den gesamten Text

<a> 
    <b> 
    first 
    </b> 
    second 
</a> 

Ich versuche es mit Python zu analysieren wie firstsecond den Text aus und verbinden den ganzen Text zu einer Zeichenfolge zu erhalten. Dazu habe ich folgendes Skript

import xml.etree.ElementTree as ET 

top = ET.fromstring(myXml) 
for a in top.iter('a'): 
    s = '' 
    if a.text: 
    s += a.text 
    else: 
    for b in a.iter('b'): 
     if b.text: 
     s += b.text 
    print s 

Aber das Skript druckt nur das erste Element first. Der zweite scheint irgendwie verloren zu gehen. Es funktioniert, wenn ich beide Strings in <a></a> oder beide in <b></b> habe.

<a> 
    firstsecond 
</a> 

Drucke firstsecond

<a> 
    <b> 
    first 
    </b> 
    <b> 
    second 
    </b> 
</a> 

Drucke firstsecond

Fehle ich etwas den zweiten String zu erhalten, wenn seine in der gleichen <a></a> als <b></b>? Oder ist das mit etree einfach nicht möglich und ich muss es neu verpacken? Das XML wird angegeben, ich kann die Quelle daher nicht ändern.

Danke für jede Hilfe.

Antwort

0

Ich fand einen Weg, um es mit der tostring Funktion zu vereinfachen.

top = ET.fromstring(myXml) 
for a in top.iter('a'): 
    s = ET.tostring(a, method='text') 
    print s 

Diese Funktion kombiniert nur alle Texte der Elemente und Subelemente

2

b.tail enthält second in Ihrem ersten Beispiel. Text nach einem End-Tag wird in ElementTree als tail angesehen. Tatsächlich wird es auch den Whitespace enthalten und eher wie \n second\n sein.

Betrachten wir eine schön formatierte Datenblock von XML:

<a> 
    <b>first</b> 
    <b>second</b> 
</a> 

Hier finden Sie Datenfelder in b.text und Leerzeichen Formatierung in tail erhalten, die leicht ignoriert werden kann.

+0

danke, das funktioniert. Aber ich habe gerade die Tostring-Funktion gefunden, um es einfacher zu machen, dann bin ich nicht davon abhängig, ob es vor oder nach dem Kind-Element ist. –

+0

@Memnon Ja, das ist eine Hilfsfunktion, die den gesamten Text und Schwanz sammelt. Aber die meisten XML-Dokumente sehen wie mein schön formatiertes Beispiel oben aus, wo du den Schwanz nicht haben willst, weshalb das Konzept existiert. –

+0

Ich würde absolut ein schön formatiertes XML bevorzugen, aber so bekomme ich es. Ich dachte auch darüber nach, es vor dem Parsen neu zu formatieren, aber das ist auch nervig. –

0

Wie wäre es dieses, ich es auf dem XML-Datei getestet:

import xml.etree.ElementTree as ET 
x = 'xml.xml' # your xml file 
tree = ET.parse(x) 
root = tree.getroot() 
string = "" 
for c in root: 
string += c.text.strip() 
print string 

Ausgang:

firstsecond 
Verwandte Themen