0

pykml を使用して、複数の目印を含む kml ファイルを解析しようとしています。主に Google Earth で地理データを視覚化する目的で、kml の説明内の HTML コードを編集したいと考えています。私はそうするために多くの方法を研究しました:

ただし、以下に示す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 私のコード スニペット: (これは、私のソースの 1 つに基づいて動作するはずです)

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 をインストールしました。現在、Python 2.7.10 を使用しています。kml ファイルには行が含まれています。(kml リンク: https://sites.google.com/site/kmlhostingmwss/trim.kml ) ArcGIS 10.2 の Python 2.7 も使用しています。

kmlファイルの操作は初めてです。誰かが私が間違っていることを教えてもらえますか? または、kml ファイルの説明を編集する簡単な方法はありますか? どうもありがとうございました。:)))

4

1 に答える 1

2

xml にはいくつかの問題があります。エラーを取り除きたい場合はxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"、2 行目に追加します。

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

破損した xml でより適切に機能するlxml.htmlを使用することもできます。データ自体も 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>]
于 2016-06-23T10:45:49.670 に答える