【问题标题】:Processing XML in Python with ElementTree使用 ElementTree 在 Python 中处理 XML
【发布时间】:2012-07-08 14:04:03
【问题描述】:

我对 ElementTree.iter() 有疑问。

所以我在这个链接中尝试了这个例子:http://eli.thegreenplace.net/2012/03/15/processing-xml-in-python-with-elementtree/

这就是我尝试过的:

import elementtree.ElementTree as ET
tree = ET.parse('XML_file.xml')
root = tree.getroot()
for elem in tree.iter():
    print elem.tag, elem.attrib

我得到这个错误 AttributeError: ElementTree instance has no attribute 'iter'

附加信息:我的 Python 版本是 2.4,我单独安装了 elementtree。我提供的链接中的其他示例在我安装的 Python 中运行。只有 ElementTree.iter() 不起作用。提前感谢您的所有帮助。干杯!

【问题讨论】:

标签: python xml parsing elementtree


【解决方案1】:

在你的情况下,你应该用.getiterator()替换.iter(),你可能应该为root元素调用它,而不是树(但我不确定,因为我没有Python 2.4和我手中的模块)。

import elementtree.ElementTree as ET
tree = ET.parse('XML_file.xml')
root = tree.getroot()
for elem in root.getiterator():
    print elem.tag, elem.attrib

这是 Python 2.7 中已弃用的旧功能。对于 Python 2.7,.iter() 应该与内置模块一起使用:

import xml.etree.ElementTree as ET
tree = ET.parse('XML_file.xml')
root = tree.getroot()
for elem in root.iter():
    print elem.tag, elem.attrib

附注:标准模块还支持通过元素节点的直接迭代(即没有.iter() 或任何调用的方法,只有for elem in root:)。它与.iter() 不同——它只通过直接的后代节点。与.getchildren() 类似的功能在旧版本中实现。

【讨论】:

  • 好的,谢谢你,我回家后会试试这个,我会尽快更新你。再次感谢!
  • 我已经尝试过 getiterator(),但它调用了根文件夹的所有子文件夹。如何调用孩子的子元素?
  • 是的,.iter().getiterator() 就是这样定义的。 .getchildren() 返回一个仅包含节点子节点(没有孙子节点)的列表。您可能对 lxml (lxml.de) 感兴趣,它也适用于 Python 2.4,具有相同的 API,但也实现了 XPath 1.0 表达式。
  • 我现在使用 .find() 来寻找特定的子元素,这是个好主意吗?或者还有另一种调用特定元素的方法?再次感谢!
  • 这取决于你需要找到什么。 .find(pattern) 找到具有所需属性的第一个元素。 pattern 可以是标记或 XPath 表达式。同样,.getiterator(tag) 遍历具有给定标签名称的所有元素。查看getpython3.com/diveintopython3/xml.html,了解如何使用 XPath、ElementTree 或 lxml。
【解决方案2】:

尝试使用 findall 而不是 iter。 ElementTree's iter() equivalent in Python2.6

【讨论】:

    【解决方案3】:

    根据 python 文档,这个 API 应该在 2.5 中,但是它不存在。 您可以使用下面提到的代码进行迭代。这样你也可以传递标签。

    def iter(element, tag=None):
        if tag == "*":
            tag = None
        if tag is None or element.tag == tag:
            yield element
        for e in element._children:
            for e in e.iter(tag):
                yield e
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 2017-08-31
      • 1970-01-01
      相关资源
      最近更新 更多