2017-02-11 1 views
2

J'utilise python le troisième et l'API ElementTree. J'ai quelques xml de la forme:Python ElementTree - analyse les nœuds enfants et le texte dans l'ordre

<root> 
    <item>Over the <ref id="river" /> and through the <ref id="woods" />.</item> 
    <item>To Grandmother's <ref id="house" /> we go.</item> 
</root> 

Je veux être en mesure de parcourir le texte et les nœuds enfants pour un élément donné dans l'ordre. Ainsi, pour le premier élément, la liste que je veux ligne imprimée par ligne serait:

Over the 
<Element 'ref' at 0x######> 
and through the 
<Element 'ref' at 0x######> 
. 

Mais je ne peux pas comprendre comment faire cela avec ElementTree. Je peux obtenir le texte dans l'ordre via itertext() et les éléments enfants dans l'ordre de plusieurs façons, mais pas les entrelacées ensemble dans l'ordre. J'espérais pouvoir utiliser une expression XPath comme ./@text|./ref, mais le sous-ensemble de XPath de ElementTree ne semble pas supporter la sélection d'attribut. Si je pouvais juste obtenir le contenu original brut de chaque nœud d'élément, je pourrais analyser moi-même si nécessaire.

+0

comment devrait regarder la sortie finale? – RomanPerekhrest

+0

La sortie est indiquée ci-dessus. – xdhmoore

Répondre

3

Essayez ceci:

from xml.etree import ElementTree as ET 

xml = """<root> 
    <item>Over the <ref id="river" /> and through the <ref id="woods" />.</item> 
    <item>To Grandmother's <ref id="house" /> we go.</item> 
</root>""" 

root = ET.fromstring(xml) 

for item in root: 
    if item.text: 
     print(item.text) 
    for ref in item: 
     print(ref) 
     if ref.tail: 
      print(ref.tail) 

ElementTree la représentation du "contenu mixte" est basé sur .text et .tail attributs. Le .text d'un élément représente le texte de l'élément jusqu'au premier élément enfant. Le .tail de cet enfant contient alors le texte de son parent le suivant. Voir le API doc.