2015-11-09 3 views
1

Я получил файл KML - Я использую wikipedia 'default' в качестве образца:Разбор KML файл, используя LXML

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://www.opengis.net/kml/2.2"> 
<Document> 
<Placemark> 
    <name>New York City</name> 
    <description>New York City</description> 
    <Point> 
    <coordinates>-74.006393,40.714172,0</coordinates> 
    </Point> 
</Placemark> 
</Document> 
</kml> 

И я пытаюсь извлечь координаты.

Теперь у меня есть фрагмент рабочего, который встраивает пространство имен для поиска:

#!/usr/python/python3.4/bin/python3 

from lxml import etree as ET 

tree = ET.parse('sample.kml') 
root = tree.getroot 

print (root.find('.//{http://www.opengis.net/kml/2.2}coordinates').text) 

Это прекрасно работает.

Однако, найдя это:

Parsing XML with namespace in Python via 'ElementTree'

Я пытаюсь сделать это через чтение имен из документа, используя «root.nsmap».

print (root.nsmap) 

дает мне:

{None: '{http://www.opengis.net/kml/2.2}'} 

Так что я думаю, что я должен быть в состоянии сделать это:

print (root.find('.//coordinates',root.nsmap).text) 

Или что-то очень похожи, используя None пространство имен. (например, не имеет префикса). Но это не работает - я получаю сообщение об ошибке при выполнении его:

AttributeError: 'NoneType' object has no attribute 'text' 

Я предполагаю, что означает, что мой «найти» не нашли ничего в данном случае.

Что мне здесь не хватает?

ответ

1

Этот код,

root.find('.//coordinates', root.nsmap) 

не возвращает ничего, потому что префикс не используется. См. http://lxml.de/xpathxslt.html#namespaces-and-prefixes.

Ниже представлены два варианта работы.

  1. Определить другой nsmap с реальным префиксом в качестве ключа:

    nsmap2 = {"k": root.nsmap[None]} 
    print (root.find('.//k:coordinates', nsmap2).text) 
    
  2. Не беспокоить с приставками. Поместите пространство имен URI в фигурных скобках («Кларк нотации»), чтобы сформировать универсальное имя элемента:

    ns = root.nsmap[None] 
    print (root.find('.//{{{0}}}coordinates'.format(ns)).text) 
    
Смежные вопросы