首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pykml解析kml时出现Lxml错误

使用pykml解析kml时出现Lxml错误
EN

Stack Overflow用户
提问于 2016-06-23 09:11:43
回答 1查看 1K关注 0票数 0

我试图使用pykml解析包含多个placemark的kml文件。我想在kml的描述中编辑HTML代码,主要用于Google中地理数据的可视化。我研究了很多方法来做到这一点:

但是,我总是得到如下所示的lxml错误。:(

代码语言:javascript
复制
    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

这是我的代码片段:(这应该是基于我的一个来源)

代码语言:javascript
复制
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,目前正在使用Python2.7.10。kml文件包含行。(kml链接:https://sites.google.com/site/kmlhostingmwss/trim.kml)我的ArcGIS 10.2中也有Python2.7。

我是新来处理kml文件的。有人能告诉我我做错了什么吗?还是有更简单的方法来编辑kml文件的描述?非常感谢。:))

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-23 10:45:49

xml存在一些问题,如果要删除错误,请将xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"添加到第二行:

代码语言:javascript
复制
<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,可以实现以下工作:

代码语言:javascript
复制
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"]}))

这给了你:

代码语言:javascript
复制
[<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内部获得一个:

代码语言:javascript
复制
from lxml import html
xml = html.parse("trim.kml")
print(xml.xpath("//placemark/description"))

这给了你:

代码语言:javascript
复制
[<Element description at 0x7f1c757fad08>, <Element description at 0x7f1c757fad60>, <Element description at 0x7f1c757fadb8>, <Element description at 0x7f1c757fae10>, <Element description at 0x7f1c757fae68>, <Element description at 0x7f1c757faec0>]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37987165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档