2016-09-27 17 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

関連する問題