2015-06-22 220 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。