2013-07-17 74 views
2

我想分析一個XML內容並返回一個字典,其中只包含名稱屬性及其值作爲字典。例如:使用python腳本從xml提取屬性和特定標記值

<ecmaarray> 
    <number name="xyz1">123.456</number> 
    <ecmaarray name="xyz2"> 
     <string name="str1">aaa</string> 
     <number name="num1">55</number> 
    </ecmaarray> 
    <strictarray name="xyz3"> 
     <string>aaa</string> 
     <number>55</number> 
    </strictarray> 
</ecmaarray> 

輸出必須是在一本字典是這樣的..

Dict:{ 'xyz1': 123.456, 
     'xyz2': {'str1':'aaa', 'num1': '55'}, 
     'xyz3': ['aaa','55'] 
    } 

任何一個可以表明該遞歸解決方案?

+0

lxml是你的朋友 –

+0

'xmltodict'是這個用例的理想選擇。雖然它可能不會生成那*字典*(默認情況下,反正)。 –

+0

感謝Jakob Bowyer和Brian Cain的快速回復。有沒有可能提供更詳細的幫助? – Aryan

回答

1

假設情況是這樣的:

<strictarray name="xyz4"> 
    <string>aaa</string> 
    <number name="num1">55</number> 
</strictarray> 

是不可能的,這是一個使用lxml一個示例代碼:

from lxml import etree 


tree = etree.parse('test.xml') 

result = {} 
for element in tree.xpath('/ecmaarray/*'): 
    name = element.attrib["name"] 
    text = element.text 
    childs = element.getchildren() 

    if not childs: 
     result[name] = text 
    else: 
     child_dict = {} 
     child_list = [] 
     for child in childs: 
      child_name = child.attrib.get('name') 
      child_text = child.text 
      if child_name: 
       child_dict[child_name] = child_text 
      else: 
       child_list.append(child_text) 

     if child_dict: 
      result[name] = child_dict 
     else: 
      result[name] = child_list 


print result 

打印:

{'xyz3': ['aaa', '55'], 
'xyz2': {'str1': 'aaa', 'num1': '55'}, 
'xyz1': '123.456'} 

您可能需要提高代碼 - 這只是暗示去哪裏。

希望有所幫助。

+0

謝謝Alecxe,這有助於:) – Aryan

+0

任何遞歸解決方案? – Aryan