2016-11-08 3 views
0

Python xml ElementTree APIを使用して以下のXMLファイルを解析したいと思います。このサンプルコードでPython xml ElementTree findallは空の結果を返します

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 

<foos> 

<foo_table> 

<!-- bar --> 
<fooelem> 
<fname>BBBB</fname> 
<group>SOMEGROUP</group> 
<module>some module</module> 
</fooelem> 

<fooelem> 
<fname>AAAA</fname> 
<group>other group</group> 
<module>other module</module> 
</fooelem> 
<!-- bar --> 

</foo_table> 
</foos> 

私は/ FOOS/foo_table/fooelem/fnameの下にあるすべての要素を見つけることを試みるが、このコードを実行するとき、明らかにfindAllは何かを見つけることはありません。

import xml.etree.cElementTree as ET 
tree = ET.ElementTree(file="min.xml") 
for i in tree.findall("./foos/foo_table/fooelem/fname"): 
    print i 

root = tree.getroot() 
for i in root.findall("./foos/foo_table/fooelem/fname"): 
    print i 

私はElementTreeのAPIで経験していないのですが、私はhttps://docs.python.org/2/library/xml.etree.elementtree.html#example下の例を使用しました。私の場合、なぜそれがうまくいかないのですか?

答えて

0

foosがあなたのrootである、あなたは、例えば、以下のfindallを開始する必要があります

root = tree.getroot() 
for i in root.findall("foo_table/fooelem/fname"): 
    print i.text 

出力:

BBBB 
AAAA 
+0

ありがとうございます。 tree.findall()の代わりにroot.findall()を選択する特別な理由はありますか?両方とも同じ結果を示しているようです。 – ThoWe

+0

@ThoWe:私が知っている理由はありません、私の推測では、それはちょうど慣習であるということでしょう。 –

1

これは、使用しているパスがルート要素(foos)より前に開始されているためです。
は、代わりにこれを使用します:foo_table/fooelem/fname

+0

私を8秒打つために。 –

+0

@MaximilianPeters hehe、ありがとう。感謝しました:) – Olian04

0

findallは動作しませんが、これを行います。

e = xml.etree.ElementTree.parse(myfile3).getroot() 
mylist=list(e.iter('checksum')) 
print (len(mylist)) 

マイリストは、適切な長さを持つことになります。

+0

コードのみの回答はお勧めしません。あなたの答えを編集し、あなたのコードに説明を加えてください。 – WebDevBooster

関連する問題