Python XML解析XML属性

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

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

我想通过'name ='controller''来获取文本。 在上面的XML文本中,我需要接收“A”而不是“控制器”。

我使用了xml.etree.ElementTree但它显示了名为“controller”的name属性的值。


假设你的文件是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

对于xml.etree.ElementTree ,使用Elementtext属性来获取Element内的文本 -

示例 -

import xml.etree.ElementTree as ET
x = ET.fromstring('<a>This is the text</a>')
x.text
>> 'This is the text'

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

import xml.etree.ElementTree as ET

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

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

这将循环所有名称属性为控制器的类型元素。 在XPath中,.//意味着当前节点的所有后代,而名称类型意味着那些标签是类型的。 括号是一个谓词表达式,它只表示满足条件的节点。 @name表示名称属性。 因此这个表达式意味着选择所有类型的节点(不管多深),其名称属性等于控制器。

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

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

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

*匹配任何元素节点。

链接地址: http://www.djcxy.com/p/29955.html

上一篇: Python XML Parse with xml attributes

下一篇: Specific pathing to find XML elements using minidom in Python