2015-06-22 118 views
1

我有一个文件中包含xml的许多行,我试图写一个Python脚本,将通过这些行并计算出特定节点属性的多少实例。例如,我的树看起来像:Python的XML解析XML属性

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

我想行字和 'NAME = “控制器”'。在上面的XML文本中,我需要接收“A”而不是“控制器”。

我用xml.etree.ElementTree,但它显示名称属性的值是“控制器”。

回答

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 
0

对于xml.etree.ElementTree,使用Elementtext属性来获取元素中的文本 -

示例 -

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

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表示名称属性。因此这个表达式意味着选择所有类型的节点(不管多深),其名称属性等于控制器。

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

如果你想与属性,而不仅仅是类型节点的所有节点,与

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

的*匹配任何元素节点替换参数的函数findAll。