2016-09-27 66 views
0

我急需一些解析XML文件的幫助。我一直在旋轉我的輪子幾個星期,並沒有取得很大的進展。我有下面的XML片段,並試圖創建一個名稱和值的列。問題是,有些名稱被索引並導致對齊問題,當我並排打印它們時。Python XML解析 - 對齊索引元素

您可以請幫助或指導我解析這個XML並獲得所需的打印?理想情況下,我希望不使用lxml,因爲系統沒有這個模塊,但也不介意使用lxml。

XML文件示例:

<root> 
    <elments> 
    <mgmtid> 
     <date>20160926</date> 
     <gp>3600</gp> 
     <name p="">watermelons</name> 
     <name p="">bananas</name> 
     <name p="">oranges</name> 
     <valuegroup> 
     <objid>None</objid> 
     <value p="">10</value> 
     <value p="">15</value> 
     <value p="">20</value> 
     </valuegroup> 
    </mgmtid> 
    <mgmtid> 
     <date>20160926</date> 
     <gp>3600</gp> 
     <name p="">apples</name> 
     <valuegroup> 
     <objid>red</objid> 
     <value p="">100</value> 
     </valuegroup> 
     <valuegroup> 
     <objid>blue</objid> 
     <value p="">200</value> 
     </valuegroup> 
     <valuegroup> 
     <objid>yellow</objid> 
     <value p="">300</value> 
     </valuegroup> 
     <valuegroup> 
     <objid>white</objid> 
     <value p="">400</value> 
     </valuegroup> 
     <valuegroup> 
     <objid>green</objid> 
     <value p="">500</value> 
     </valuegroup> 
    </mgmtid> 
    <mgmtid> 
     <date>20160926</date> 
     <gp>3600</gp> 
     <name p="">strawberry</name> 
     <name p="">guava</name> 
     <valuegroup> 
     <objid>None</objid> 
     <value p="">650</value> 
     <value p="">750</value> 
     </valuegroup> 
    </mgmtid> 
    </elments> 
</root> 

我試圖在獲得名和值(慘敗)。正如你所看到的,這些值與他們的名字不一致。

import xml.etree.ElementTree as ET 
import itertools 
import collections 

tree = ET.parse('test_xml_file.xml') 
root = tree.getroot() 

names = [] 
values = [] 

for i in (tree.findall('.//')): 
    if i.tag == 'name': 
     n = (i.tag, i.text) 
     names.append(n[0] + ' ' + str(n[1])) 

for i in (tree.findall('.//')): 
    if i.tag == 'value' or i.tag == 'objid': 
     v = (i.tag, i.text) 
     values.append(v[0] + ' ' + str(v[1])) 

print('=' * 45) 
for n, v in itertools.zip_longest(names, values): 
    print(str(n).ljust(20, ' ') + str(v)) 

電流輸出:

name watermelons objid None 
name bananas  value 10 
name oranges  value 15 
name apples   value 20 
name strawberry  objid red 
name guava   value 100 
None    objid blue 
None    value 200 
None    objid yellow 
None    value 300 
None    objid white 
None    value 400 
None    objid green 
None    value 500 
None    objid None 
None    value 650 
None    value 750 

所需的輸出:

============================= 
name  Index value 
============================= 
watermelons None 10 
bananas  None 15 
oranges  None 20 
apples  red  100 
apples  blue 200 
apples  yellow 300 
apples  white 400 
apples  green 500 
strawberry None 650 
guava  None 750 

回答

0

我沒有看到解決它的快速和花哨的方式,此代碼的工作:

import xml.etree.ElementTree as ET 
tree = ET.parse('test_xml_file.xml') 
elements = [] 
mgmtids = tree.getroot().findall(".//mgmtid") 
for mgmtid in mgmtids: 
    names = mgmtid.findall(".//name") 
    objids = mgmtid.findall(".//valuegroup/objid") 
    values = mgmtid.findall(".//valuegroup/value") 
    if len(names) == len(values): 
     for i in range(len(names)): 
      elements.append([names[i].text,objids[0].text,values[i].text]) 
    elif len(objids)==len(values): 
     for i in range(len(values)): 
      elements.append([names[0].text,objids[i].text,values[i].text]) 
    elif len(names) == len(objids): 
     for i in range(len(names)): 
      elements.append([names[i].text,objids[i].text,values[0].text]) 
     #elements.append([names[i].text,objids[i].text,values[i].text for i in len(names)]) 
print "\n".join([" - ".join([text for text in el]) for el in elements]) 

希望它有幫助!

+0

感謝您關注此事。雖然這並沒有完全達到我所期望的目標,但它確實幫助/指導我將非索引值的名稱和值對齊。我將繼續尋找索引值的解決方案。謝謝。 – MBasith