2016-06-23 1 views
0

Im пытается разобрать файл kml, содержащий несколько меток, используя pykml. Я хочу отредактировать код HTML внутри описания kml, главным образом для целей визуализации географических данных в Google Earth. Ive исследовал много способов сделать это:Ошибка Lxml при анализе kml с использованием pykml

однако, я всегда получаю ошибку LXML показанную ниже. :(

Traceback (most recent call last): 
    File "C:\Users\Arellano\Copy\BSGE\2015-2016 SUMMER\trial7.py", line 5, in <module> 
    root = parser.fromstring(open('trim_KML.kml', 'r').read()) 
    File "C:\Program Files (x86)\Python2.7.10\lib\site-packages\pykml-0.1.0-py2.7.egg\pykml\parser.py", line 41, in fromstring 
    return objectify.fromstring(text) 
    File "src/lxml/lxml.objectify.pyx", line 1801, in lxml.objectify.fromstring (src\lxml\lxml.objectify.c:25171) 
    File "src/lxml/lxml.etree.pyx", line 3213, in lxml.etree.fromstring (src\lxml\lxml.etree.c:77697) 
    File "src/lxml/parser.pxi", line 1819, in lxml.etree._parseMemoryDocument (src\lxml\lxml.etree.c:116494) 
    File "src/lxml/parser.pxi", line 1707, in lxml.etree._parseDoc (src\lxml\lxml.etree.c:115144) 
    File "src/lxml/parser.pxi", line 1079, in lxml.etree._BaseParser._parseDoc (src\lxml\lxml.etree.c:109543) 
    File "src/lxml/parser.pxi", line 573, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:103404) 
    File "src/lxml/parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:105058) 
    File "src/lxml/parser.pxi", line 613, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:103967) 
XMLSyntaxError: Namespace prefix xsi for schemaLocation on Document is not defined, line 3, column 32 

Heres мой фрагмент кода: (который должен работать на базе одного из моих источников)

from pykml import parser 

root = parser.fromstring(open('trim_KML.kml', 'r').read()) 
print etree.tostring(root.Document.Placemark.LineString.Description) 

я установил pykml и LXML 3.6.0 и Im в настоящее время с помощью моего Python 2.7 .. .10 файл KML содержит строки (KML ссылки: https://sites.google.com/site/kmlhostingmwss/trim.kml).. у меня есть Python 2.7 из моего ArcGIS 10.2

Im новой с работой с файлами Kml Может кто-то пожалуйста, скажите мне, что я делаю неправильно или? есть ли более простой способ редактировать описание kml файлы? Большое спасибо. :)))

+0

Можете ли вы опубликовать документ здесь? Включает ли это ''? – advance512

+0

Да, у него есть заголовок xml. Я включил ссылку kml на свой пост :) (Использование kml Im было произведено через Layer to KML в Arcgis). Теперь я использую lxml.html вместо этого, чтобы разобрать его. =)) –

ответ

1

XML-есть некоторые проблемы, если вы хотите, чтобы устранить ошибку, добавьте xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ко второй строке:

<kml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 

Затем с помощью LXML, следующие работы:

import lxml.etree as et 

xml = et.parse("trim.kml").getroot() 

print(xml.xpath("//kml:Document//kml:Placemark/kml:description", namespaces={"kml":xml.nsmap["kml"]})) 

Что дает вам:

[<Element {http://www.opengis.net/kml/2.2}description at 0x7f612d0885f0>, <Element {http://www.opengis.net/kml/2.2}description at 0x7f612d088cb0>, <Element {http://www.opengis.net/kml/2.2}description at 0x7f612d088d40>, <Element {http://www.opengis.net/kml/2.2}description at 0x7f612d088d88>, <Element {http://www.opengis.net/kml/2.2}description at 0x7f612d088dd0>, <Element {http://www.opengis.net/kml/2.2}description at 0x7f612d088e18>] 

Вы также можете использовать lxml.html, который будет работать лучше с разбитым xml, сами данные также составляют 99 процентов html.

Вы можете получить один из внутри document.placemark с:

from lxml import html 
xml = html.parse("trim.kml") 
print(xml.xpath("//placemark/description")) 

Что дает:

[<Element description at 0x7f1c757fad08>, <Element description at 0x7f1c757fad60>, <Element description at 0x7f1c757fadb8>, <Element description at 0x7f1c757fae10>, <Element description at 0x7f1c757fae68>, <Element description at 0x7f1c757faec0>] 
+0

О, ничего себе! Теперь работает. Спасибо @PadraicCunningham! Вместо этого я использую lxml.html. :) –

Смежные вопросы