我正在尝试编写Python(2.6.6)程序来解析xml,并使用其某些元素来检查某些条件。我正在使用xml.etree.cElementTree,这是大多数在线讨论所建议的。
我正在使用的示例xml:
<?xml version="1.0" encoding="UTF-8"?>
<drum>
<cmts>
<Pre_EQ>
<success field_name="success">1</success>
<coefficient field_name="coefficient">080118000000ffd00000ffe00000fff0001000200020fff000000010002000003fa0000000000020003000000020ffd00010001000000000000000000010000000000020ffc0000000000020000000500010ffe0fff0ffe0ffd0fff0fff0ffd0ffd0fff0</coefficient>
</Pre_EQ>
</cmts>
</drum>
在搜索从xml中获取选择元素的不同方法时,我发现iterfind()可用于选择特定元素,但我认为2.6.6(2.7及更高版本)不支持该元素。因此,当我尝试使用iterfind()时,在python提示符下出现以下错误:
>>> import xml.etree.cElementTree as ET
>>> tree = ET.ElementTree(file='Test.xml')
>>> for elem in tree.iterfind('Pre_EQ/success'):
... print elem.tag, elem.attrib, elem.text
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ElementTree instance has no attribute 'iterfind'
>>> for elem in tree.iterfind('success[@field_name="success"]'):
... print elem.tag, elem.attrib, elem.text
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: ElementTree instance has no attribute 'iterfind'
>>>
我遇到了iter()几乎相同的问题,该问题不受2.6.6的支持,但是我可以通过搜索在这里发现它等效于getiterator()(它对我有用)。
但是,我找不到像iterfind()这样可以使用的东西(搜索特定的标签名称,以获得标签的值/文本)。
我已经尝试通过使用tree.find等尝试“ find”,“ findall”和“ findtext”,但无法使其中任何一个正常工作。
您能否建议我一些方法来等效于2.6.6的iterfind()或其他方法来搜索特定的标签名称,以获取其标签值/文本。
最佳答案
从documentation of xml.etree.ElementTree
-
iter(tag = None)
创建一个以当前元素为根的树迭代器。的
迭代器迭代此元素及其下的所有元素,
文档(深度优先)顺序。如果标签不是None或'*',则只有元素
从迭代器返回其标签等于tag的标签。如果树
在迭代过程中修改结构,结果不确定。
2.7版的新功能。
iterfind(匹配)
通过标签名称或路径查找所有匹配的子元素。返回一个
迭代产生文档顺序中的所有匹配元素。
2.7版的新功能。
(强调我的)
就像您注意到的那样,您不能在Python 2.7中使用iterfind
或iter
。
您将必须使用findall()
方法来获取所需的数据。从我的经验来看,findall()
在Python 2.6中也不支持带有谓词(用于属性)的XPath。因此,您需要获取所有标记名称为success
的元素,然后检查这些元素的属性以查看它们是否等于您想要的值。
代码-
第一
>>> import xml.etree.cElementTree as ET
>>> tree = ET.ElementTree(file='Test.xml')
>>> for elem in tree.findall('.//Pre_EQ/success'):
... print elem.tag, elem.attrib, elem.text
第二
>>> for elem in tree.findall('.//success'):
... if elem.attrib.get('field_name') == "success":
... print elem.tag, elem.attrib, elem.text
演示-
>>> s='''<?xml version="1.0" encoding="UTF-8"?>
... <drum>
... <cmts>
... <Pre_EQ>
... <success field_name="success">1</success>
... <coefficient field_name="coefficient">080118000000ffd00000ffe00000fff0001000200020fff000000010002000003fa0000000000020003000000020ffd00010001000000000000000000010000000000020ffc0000000000020000000500010ffe0fff0ffe0ffd0fff0fff0ffd0ffd0fff0</coefficient>
... </Pre_EQ>
... </cmts>
... </drum>'''
>>> tree = ET.fromstring(s)
>>> for elem in tree.findall('.//Pre_EQ/success'):
... print elem.tag, elem.attrib, elem.text
...
success {'field_name': 'success'} 1
>>>
>>>
>>> for elem in tree.findall('.//success'):
... if elem.attrib.get('field_name') == "success":
... print elem.tag, elem.attrib, elem.text
...
success {'field_name': 'success'} 1