【问题标题】:Python search data within XML elementsXML 元素中的 Python 搜索数据
【发布时间】:2013-03-26 21:47:33
【问题描述】:

我认为这将适用于搜索“错误”的标记值

import xml.etree.cElementTree as ET

xml = """
  <tag1>
    <tag2>
      error
    </tag2>
    <tag3>
      working
    </tag3>
    <tag4>
      <tag5>
        error
      </tag5>
    </tag4>
  </tag1>
"""

for event, element in ET.fromstring(xml):
  if element.text.strip() == "error":
    print element.tag

我遇到以下错误:

Traceback (most recent call last):
  File "test.py", line 19, in <module>
    for event, element in ET.fromstring(xml):
ValueError: need more than 0 values to unpack

“需要多于 0 个值才能解包”是什么意思?

【问题讨论】:

    标签: python xml elementtree celementtree


    【解决方案1】:

    文档迭代器返回Element,不能拆分成(event, element)。您应该删除“事件”。但这也不完全正确,因为元素迭代器只会给你孩子(tag2,tag3,tag4)。您需要调用 element.iter() 来获取所有后代。

    >>> for element in ET.fromstring(xml).iter():
    ...     if element.text.strip() == 'error':
    ...             print element.tag
    ...
    tag2
    tag5
    >>>
    

    【讨论】:

      【解决方案2】:

      迭代Element 对象一次会产生一个 元素,但您的循环需要两个 值。您在这里混淆了.fromstring().iterparse()

      你真的只需要.findall():

      tree = ET.fromstring(xml)
      for elem in tree.findall('.//*'):
          if elem.text and elem.text.strip() == 'error':
              print elem.tag
      

      .iter(),其作用相同(循环遍历树中的所有元素):

      tree = ET.fromstring(xml)
      for elem in tree.iter():
          if elem.text and elem.text.strip() == 'error':
              print elem.tag
      

      如果您真的想使用事件驱动程序iterparse,您需要提供一个文件对象:

      from cStringIO import StringIO
      for event, element in ET.iterparse(StringIO(xml)):
          if element.text.strip() == "error":
              print element.tag
      

      所有sn-ps打印:

      tag2
      tag5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多