2015-02-23 129 views
2

我有一個XML文件,如下所示:Python和XML結構字典

<?xml version="1.0"?> 
<max:SyncObject xmlns:max="http://www.ibm.com/max"> 
    <max:ObjectSet> 
    <max:PARENT action="AddChange"> 
     <max:FIELD1>string</max:FIELD1> 
     <max:FIELD2>string</max:FIELD2> 
     <max:FIELD3>string</max:FIELD3> 
     <max:FIELD4>string</max:FIELD4> 
     <max:FIELD5>string</max:FIELD5> 
     <max:FIELD6>string</max:FIELD6> 
     <max:FIELD7>string</max:FIELD7> 
     <max:CHILD1 action="Ignored"> 
     <max:CH1FIELD1 action="Ignored"> 
      <max:CH1SUB1>string</max:CH1SUB1> 
     <max:CH1FIELD2>string</max:CH1FIELD2> 
     </max:CHILD1> 
     <max:CHILD2 action="Ignored"> 
     <max:CH2FIELD1>string</max:CH2FIELD1> 
     </max:CHILD2> 
    </max:PARENT> 
    </max:ObjectSet> 
</max:SyncObject> 

和我的最終結果,我想實現如下:

{'PARENT': ['FIELD1', 'FIELD2', 'FIELD3', 'FIELD4', 'FILED5', 'FIELD6', 'FIELD7', 'CHILD1', 'CHILD2']}, {'CHILD1': ['CH1FIELD1', 'CH1FIELD2'], 'CHILD2': ['CH2FIELD1'], 'CH1FIELD1':['CH1SUB1']} 

所以我嘗試了好幾種不同可以從XML文件中提取FIELD1FIELD2 ...標籤,同時仍然保持結構,因爲您可以看到PARENT字典與其他字典是分開的,並且包含所有正好位於下一級的標籤。兒童標籤也是如此。行動attrib是不需要的,因爲這將通過班級內的其他手段來指定。

看來,大多數lxml和elementtree適合從XML標籤中提取屬性,而不是標籤本身。

任何人都可以指出我正確的方向提取標籤(FIELD NAMES)沒有前綴,值或任何屬性,並保留結構?

謝謝!

回答

1

首先,你的XML數據格式不正確,有一個關閉失敗</max:CH1FIELD1>

爲了將其轉化爲Python數據結構,使用xmltodict

import xmltodict 

data = """<?xml version="1.0"?> 
<max:SyncObject xmlns:max="http://www.ibm.com/max"> 
    <max:ObjectSet> 
    <max:PARENT action="AddChange"> 
     <max:FIELD1>string</max:FIELD1> 
     <max:FIELD2>string</max:FIELD2> 
     <max:FIELD3>string</max:FIELD3> 
     <max:FIELD4>string</max:FIELD4> 
     <max:FIELD5>string</max:FIELD5> 
     <max:FIELD6>string</max:FIELD6> 
     <max:FIELD7>string</max:FIELD7> 
     <max:CHILD1 action="Ignored"> 
     <max:CH1FIELD1 action="Ignored"> 
      <max:CH1SUB1>string</max:CH1SUB1> 
     <max:CH1FIELD2>string</max:CH1FIELD2> 
     </max:CH1FIELD1> 
     </max:CHILD1> 
     <max:CHILD2 action="Ignored"> 
     <max:CH2FIELD1>string</max:CH2FIELD1> 
     </max:CHILD2> 
    </max:PARENT> 
    </max:ObjectSet> 
</max:SyncObject>""" 

d = xmltodict.parse(data, 
        process_namespaces=True, 
        namespaces={'http://www.ibm.com/max': None}) 
print d 
+0

謝謝,你能解釋一下這個回報以及如何操作呢? – txDMTN 2015-02-24 00:27:05

+0

@txDMTN當然,它會返回一個'OrderedDict'結構,您可以將其作爲普通字典進行基本操作,但它保留了順序。 – alecxe 2015-02-24 01:12:10