2017-06-13 3 views
0

私はXMLファイルを解析し、csvファイルのような出力を印刷するためのPython(minidom)を使用しています使用してXMLでのネストされた変数とのトラブル:パイソン - minidom

0.0,0.0,51.3,46.6, 
49.9,49.0,51.0,46.6, 
36.0,24.0,47.8,42.2, 
51.0,46.6,49.3,34.1, 

は代わりに、プログラムは以下を生成し、 'Q'タグをそれぞれの 'Event'タグの最後のタグでない限りスキップします...なぜ私のプログラムはこれらを印刷できませんか?ここで

0.0,0.0,,46.6 
49.9,49.0,, 
36.0,24.0,42.2, 
51.0,46.6,, 

は、XMLソースファイルです:

<?xml version="1.0" encoding="UTF-8"?> 
<Games id = "1"> 
    <Game id="1" competition_id="1"> 
    <Event id="0" x="0.0" y="0.0"> 
     <Q id="a" end_x="51.3" /> 
     <Q id="b" end_y="46.6" /> 
    </Event> 
    <Event id="1" x="49.9" y="49.0"> 
     <Q id="a" end_x="51.0" /> 
     <Q id="b" end_y="46.6" /> 
     <Q id="c" q1="tap" /> 
    </Event> 
    <Event id="2" x="0.0" y="0.0"> 
     <Q id="a" end_y="47.8" /> 
     <Q id="b" end_x="42.2" /> 
    </Event> 
    <Event id="3" x="51.0" y="46.6"> 
     <Q id="a" end_y="49.3" /> 
     <Q id="b" end_x="34.1" /> 
     <Q id="c" q1="17.8" /> 
    </Event> 
</Game> 

そして、ここに私のコードです:

from xml.dom.minidom import parse 
import xml.dom.minidom 

DOMTree = parse('myfile.xml'); 
collection = DOMTree.documentElement; 

# Get all events in the collection 
events = collection.getElementsByTagName("Event") 

# Iterate through events 
for event in events: 
    start_x = event.getAttribute('x'); 
    start_y = event.getAttribute('y'); 

    qualifiers = event.getElementsByTagName('Q'); 

    # Iterate through qualifiers 

    for qualifier in qualifiers: 
     end_x= qualifier.getAttribute('end_x'); 
     end_y= qualifier.getAttribute('end_y'); 

    print start_x + ',' + start_y + ',' + end_x + ',' + end_y 

答えて

1

あなたが修飾子にあなたのための修飾子の構造を見ればループでは、ループ内のend_xとend_yに何も起こりません。つまり、コードが実行され、end_xとend_yの値が再割り当てされます。ループの最後で、end_xとend_yは、上記の最後の修飾子

from xml.dom.minidom import parse 
import xml.dom.minidom 

DOMTree = parse('myfile.xml'); 
collection = DOMTree.documentElement; 

# Get all events in the collection 
events = collection.getElementsByTagName("Event") 

# Iterate through events 
for event in events: 
    start_x = event.getAttribute('x'); 
    start_y = event.getAttribute('y'); 

    qualifiers = event.getElementsByTagName('Q'); 

    # Iterate through qualifiers 

    for qualifier in qualifiers: 
     if(qualifier.hasAttribute('end_x')): 
      end_x= qualifier.getAttribute('end_x'); 
     elif(qualifier.hasAttribute('end_y')): 
      end_y= qualifier.getAttribute('end_y'); 

    print start_x + ',' + start_y + ',' + end_x + ',' + end_y 

コードの値は、あなたが欲しいものを行う必要があります。私が指摘した何かは、もともとは注文がend_xだったのですが、end_yは注文がend_y_end_xに変更されたので、サンプルの正しいフォーマットでは終了座標が反転されます。だから、出力は

0.0,0.0,51.3,46.6, 
49.9,49.0,51.0,46.6, 
36.0,24.0,42.2,47.8, 
51.0,46.6,34.1,49.3, 

希望これは

を助けています