如何使用ElementTree在Python中递归迭代XML标记?

如何使用ElementTree在Python中递归迭代XML标记?,python,xml,Python,Xml,我正在尝试使用ElementTree遍历树中的所有节点 我会这样做: tree = ET.parse("/tmp/test.xml") root = tree.getroot() for child in root: ### do something with child 问题是,child是一个元素对象,而不是ElementTree对象,所以我不能进一步研究它并递归遍历它的元素。是否有一种方法可以在“root”上进行不同的迭代,以便它在树中的顶级节点(直接子节点

我正在尝试使用ElementTree遍历树中的所有节点

我会这样做:

  tree = ET.parse("/tmp/test.xml")

  root = tree.getroot()

  for child in root:
       ### do something with child

问题是,child是一个元素对象,而不是ElementTree对象,所以我不能进一步研究它并递归遍历它的元素。是否有一种方法可以在“root”上进行不同的迭代,以便它在树中的顶级节点(直接子节点)上进行迭代,并返回与root本身相同的类?

要在所有节点上进行迭代,请使用上的方法,而不是根元素

根是一个元素,就像树中的其他元素一样,它只有自己的属性和子元素的上下文。ElementTree具有所有元素的上下文

例如,给定以下xml

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

1.
2008
141100
4.
2011
59900
68
2011
13600
您可以执行以下操作

>>> import xml.etree.ElementTree as ET
>>> tree = ET.parse('test.xml')
>>> for elem in tree.iter():
...     print elem
... 
<Element 'data' at 0x10b2d7b50>
<Element 'country' at 0x10b2d7b90>
<Element 'rank' at 0x10b2d7bd0>
<Element 'year' at 0x10b2d7c50>
<Element 'gdppc' at 0x10b2d7d10>
<Element 'neighbor' at 0x10b2d7e90>
<Element 'neighbor' at 0x10b2d7ed0>
<Element 'country' at 0x10b2d7f10>
<Element 'rank' at 0x10b2d7f50>
<Element 'year' at 0x10b2d7f90>
<Element 'gdppc' at 0x10b2d7fd0>
<Element 'neighbor' at 0x10b2db050>
<Element 'country' at 0x10b2db090>
<Element 'rank' at 0x10b2db0d0>
<Element 'year' at 0x10b2db110>
<Element 'gdppc' at 0x10b2db150>
<Element 'neighbor' at 0x10b2db190>
<Element 'neighbor' at 0x10b2db1d0>
>将xml.etree.ElementTree作为ET导入
>>>tree=ET.parse('test.xml')
>>>对于tree.iter()中的元素:
...     打印元素
... 

您还可以访问以下特定元素:

country= tree.findall('.//country')
然后在
范围(len(country))

和access

除了Robert Christie的答案之外,还可以通过将元素转换为ElementTree,使用
fromstring()
在所有节点上进行迭代:

import xml.etree.ElementTree as ET

e = ET.ElementTree(ET.fromstring(xml_string))
for elt in e.iter():
    print "%s: '%s'" % (elt.tag, elt.text)

除了Robert Christie接受的答案外,单独打印值和标签非常简单:

tree = ET.parse('test.xml')
for elem in tree.iter():
    print(elem.tag, elem.text)

如何打印值?是否可以使用
fromstring()
而不是
parse()
?前者直接为您提供根元素如何修改此项以显示其是否为子元素或属性等?是否可以访问元素在层次结构中的确切位置?要访问值,
elem.attrib
将为您提供属性及其在元素中的值。这非常有效。这是新功能吗?我想知道为什么没有人提到它。它是如何工作的?(在搜索
/
时遇到问题)
/
是Xpath的一部分。试试谷歌搜索。