Python XML Parse with xml attributes

时间:2015-06-22 11:38:26

标签: python xml

我在包含xml的文件中有很多行,而我正在尝试编写一个Python脚本,该脚本将遍历这些行并计算特定节点属性的实例数量。例如,我的树看起来像:

<foo>
   <bar>
      <type name="controller">A</type>
      <type name="channel">12</type>
   </bar>
</foo>

我想通过&#39; name =&#34; controller&#34;&#39;来获取行的文字。在上面的xml文本中,我需要接收&#34; A&#34;而不是&#34;控制器&#34;。

我使用xml.etree.ElementTree,但它显示了name属性的值,即&#34; controller&#34;。

3 个答案:

答案 0 :(得分:0)

对于xml.etree.ElementTree,使用text的{​​{1}}属性获取元素内的文字 -

示例 -

Element

答案 1 :(得分:0)

假设您的文件是 input.xml 。您可以使用以下代码:

import xml.etree.ElementTree as ET

tree = ET.parse('input.xml')
tree_ = tree.findall('bar')

for i in tree_:
    i_ = i.findall('type')

    for elem in i_:
        if elem.attrib['name'] == 'controller':
            print elem.text

答案 2 :(得分:0)

ElementTree支持一些有限的XPath(XPath是一种用于指定xml文件中的节点的语言)。我们可以使用它来查找所有需要的节点和text属性以获取其内容。

import xml.etree.ElementTree as ET

tree = ET.parse("filename.xml")

for x in tree.findall(".//type[@name='controller']"):
    print(x.text)

这将遍历名称属性为 controller 的所有类型元素。在XPath中,。//表示当前节点的所有后代,名称类型表示标签为类型的那些后代。括号是谓词表达式,表示只有满足条件的节点。 @name表示name属性。因此,这个表达式意味着选择所有类型的节点(无论多深),name属性等于controller。

在这个例子中,我刚刚在节点中打印了文本。你可以在那个循环体中做任何你想做的事。

如果您希望所有节点都具有该属性而不仅仅是类型节点,请将参数替换为findall函数

.//*[@name='controller']

*匹配任何元素节点。