2012-03-09 15 views
2

KMLファイル内で一致していない)(見つけます:PythonのElementTreeの私は、次のように要素の木を使用したKMLファイルから要素を見つけようとしている

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
    <Document> 
    <name>Location history from 03/03/2012 to 03/10/2012</name> 
    </Document> 
</kml> 

"name"要素が存在します。なぜ検索が空に戻ってくるのですか?

+0

良い答え(+1)であれば、xpathを '// * [name()= 'name']'に変更することもできます。 –

+0

@DevNull ...脇に - ElementTreeの 'find()'は*かなり* XPathではありません。それをXPathに触発された言語としてもっと考えてください。したがって、あなたの文字列は完全に有効なXPathであり、他のツールでも便利に使用できますが、xml.etree.ElementTreeの実装では機能しません(libxml2のXPath 1.0を使用するlxml.etree実装)。 –

+0

@CharlesDuffy - ありがとう、ありがとう! –

答えて

5

一致する要素は実際にKML名前空間内にありますが、その名前空間を念頭に置いて検索しているわけではありません。

試してみてください。

p = tree.find(".//{http://www.opengis.net/kml/2.2}name") 

あなたの代わりに、標準ライブラリのElementTreeのlxmlののXPathを使用していた場合は、あなたの代わりに辞書として名前空間を渡したい:@CharlesDuffyに加えて

>>> tree = lxml.etree.fromstring('''<kml xmlns="http://www.opengis.net/kml/2.2"> 
... <Document> 
...  <name>Location history from 03/03/2012 to 03/10/2012</name> 
... </Document> 
... </kml>''') 
>>> tree.xpath('//kml:name', namespaces={'kml': "http://www.opengis.net/kml/2.2"}) 
[<Element {http://www.opengis.net/kml/2.2}name at 0x23afe60>]