2012-03-09 3 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']'. –

+0

@DevNull ... как в стороне - 'find()' ElementTree 'не * довольно * XPath; думайте об этом больше как о языке, «вдохновленном» XPath. Таким образом, хотя ваша строка полностью допустима XPath и удобный подход к использованию с другими инструментами, она, похоже, не работает в подмножестве xml.etree.ElementTree реализует (в отличие от lxml.etree, который использует XPath 1.0 для libxml2 реализация). –

+0

@CharlesDuffy - Приятно знать спасибо! –

ответ

5

Элемент name, который вы пытаетесь сопоставить, фактически находится в пространстве имен KML, но вы не ищете это пространство имен.

Try:

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

Если вы используете XPath LXML вместо стандартного библиотека 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>]