0

ちょっとした助けが必要です。次のxmlが次のようにフォーマットされているとしましょう:

<Solution version="1.0">
   <DrillHoles total_holes="238">
     <description>
       <hole hole_id="1">
         <hole collar="5720.44, 3070.94, 2642.19" />
         <hole toe="5797.82, 3061.01, 2576.29" />
         <hole cost="102.12" />
       </hole>
    ........

編集:これは、穴の襟を作成するために使用したコードです..など.

for row in reader:
    if i > 0:
        x1,y1,z1,x2,y2,z2,cost = row
        if current_group is None or i != current_group.text:
            current_group = SubElement(description, 'hole',{'hole_id':"%s"%i})

            collar = SubElement (current_group, 'hole',{'collar':', '.join((x1,y1,z1))}),
            toe = SubElement (current_group, 'hole',{'toe':', '.join((x2,y2,z2))})
            cost = SubElement(current_group, 'hole',{'cost':cost})
    i+=1

など、ホール カラー、ホール トウ、ホール コスト データを取得する方法を教えてください。これまでのところ私のコードは次のとおりです。私は本当に近いと思います。

with open(outfile, 'w') as file_:

     writer = csv.writer(file_, delimiter="\t")
     for a in zip(root.findall("drillholes/hole/hole collar"),
             root.findall("drillholes/hole/hole toe"),
             root.findall("drillholes/hole/hole cost")):
        writer.writerow([x.text for x in a])

私のプログラムはcsvファイルを生成しますが、csvファイルは空です。そのため、検索と検索のエラーのためにこのコードがデータを取得できなかったと思います。誰でも助けることができますか?

4

1 に答える 1

0

指定はありませんが、xml.etree.ElementTree を使用していると思います。ここにはいくつかの問題があります。

1) XML では大文字と小文字が区別されます。「ドリルホール」は「ドリルホール」と同じものではありません。

2) XML にある「説明」要素がパスにありません。

3) 属性を参照するには、スペースを使用せずに、"hole/@collar" のように "@" で始まる別のパス要素を使用します。

これらを考慮すると、答えは次のようになります。

 for a in zip(root.findall("DrillHoles/description/hole/hole/@collar"),
              root.findall("DrillHoles/description/hole/hole/@toe"),
              root.findall("DrillHoles/description/hole/hole/@cost")):
   writer.writerow([x.text for x in a])

しかし、そうではありません。これをテストすると、おそらく etree の API に属性ノードが存在しないため、findall は属性ノードを返すことを本当に好まないようです。だからあなたはこれを行うことができます:

 for a in zip(root.findall("DrillHoles/description/hole/hole[@collar]"),
              root.findall("DrillHoles/description/hole/hole[@toe]"),
              root.findall("DrillHoles/description/hole/hole[@cost]")):
   writer.writerow([x[0].get('collar'), x[1].get('toe'), x[2].get('cost')])

ただし、とにかく for ループ内のステートメントの属性を一覧表示する必要がある場合は、個人的には zip を廃止して次のようにします。

for a in root.findall("DrillHoles/description/hole"):
  writer.writerow([a.find("hole[@"+attr+"]").get(attr) for attr in ("collar", "toe", "cost")])
于 2013-07-04T16:40:43.613 に答える