我正在尝试编写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中使用iterfinditer

您将必须使用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

10-04 18:27