Python在XML元素中搜索数据

时间:2013-04-04 17:19:22

标签: python xml elementtree celementtree

我认为这可用于搜索“错误”

的标记值
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个值”是什么意思?

2 个答案:

答案 0 :(得分:3)

对一个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

所有代码段打印:

tag2
tag5

答案 1 :(得分:1)

文档迭代器返回Element,无法将其拆分为(event,element)。你应该删除'event'。但这不是很正确,因为元素迭代器只会给你孩子(tag2,tag3,tag4)。你需要调用element.iter()来获取所有后代。

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