2012-03-09 25 views
2

我嘗試使用元素樹如下找到從KML文件中的元素中不匹配:Python的ElementTree的發現()KML文件

from xml.etree.ElementTree import ElementTree 

tree = ElementTree() 
tree.parse("history-03-02-2012.kml") 
p = tree.find(".//name") 

文件來演示該問題的一個子集,足以如下:

<?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

除了@CharlesDuffy好的答案(+1),你也可以把你的xpath改成'// * [name()='name']'。 – 2012-03-09 19:55:09

+0

@DevNull ... as a aside - ElementTree的'find()'不*相當* XPath;更多地將其視爲「受XPath啓發」的語言。因此,雖然您的字符串是完全有效的XPath,並且是一種方便的方法來與其他工具一起使用,但它似乎不適用於xml.etree.ElementTree實現的子集(與lxml.etree相反,後者使用libxml2的XPath 1.0實現)。 – 2012-03-09 22:24:38

+0

@CharlesDuffy - 很高興知道謝謝! – 2012-03-09 22:27:09

回答

5

您試圖匹配的name元素實際上位於KML名稱空間內,但您並未考慮該名稱空間。

嘗試:

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

如果您正在使用LXML的XPath的,而不是標準庫的ElementTree,你不是要把這個名字空間中作爲字典:

>>> 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>]