Python ElementTree - 按顺序迭代子节点和文本

时间:2017-02-11 09:09:32

标签: python xml xpath elementtree

我正在使用python第三个和ElementTree API。我有一些形式的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>

我希望能够按顺序遍历给定项目的文本和子节点。因此,对于第一个项目,我想逐行打印的列表将是:

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

但我无法弄清楚如何使用ElementTree做到这一点。我可以通过itertext()按顺序获取文本和子元素按顺序排列,但不是按顺序交错排列。我希望我可以使用像./@text|./ref这样的XPath表达式,但是ElementTree的XPath子集似乎不支持属性选择。如果我甚至可以获得每个项目节点的原始xml内容,我可以在必要时自己解析它。

1 个答案:

答案 0 :(得分:4)

试试这个:

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代表&#34;混合内容&#34;基于.text.tail属性。元素的.text表示直到第一个子元素的元素的文本。那个孩子的.tail然后包含其父母的文本。请参阅API doc