2017-02-11 11 views
2

Я использую python третий и ElementTree API. У меня есть XML-формы:Python ElementTree - итерация через дочерние узлы и текст в порядке

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

Я хочу, чтобы иметь возможность перебирать текст и дочерние узлы для данного элемента в порядке. Таким образом, для первого элемента, список Я хочу печататься строка за строкой будет:

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

Но я не могу понять, как сделать это с ElementTree. Я могу получить текст по порядку через itertext(), а дочерние элементы упорядочены несколькими способами, но не чередуются друг с другом по порядку. Я надеялся, что могу использовать выражение XPath, такое как ./@text|./ref, но подмножество ElementTree в XPath, похоже, не поддерживает выбор атрибутов. Если бы я мог просто получить исходное исходное содержимое xml каждого элемента элемента, я мог бы сам его проанализировать, если это необходимо.

+0

Как должен выглядеть конечный результат? – RomanPerekhrest

+0

Выход указан выше. – xdhmoore

ответ

3

Попробуйте это:

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 сек представление "смешанного контента" основан на .text и .tail атрибутов. Элемент .text элемента представляет текст элемента до первого дочернего элемента. Затем этот .tail этого ребенка содержит текст его родителя, следующего за ним. См. API doc.