xml.etree.ElementTree http://docs.python.jp/2/library/xml.etree.elementtree.html Verwenden Sie diese Option, um XML mit dem Namespace zu analysieren.
Im Text kml (Format für Google Earth usw.) http://ja.wikipedia.org/wiki/KML Ist zielgerichtet, aber da die tatsächliche Situation XML ist, wird es auf die gleiche Weise behandelt.
Ziel-KML
<?xml version='1.0' encoding='UTF-8'?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<name>Hoge</name>
<Style id="Mapit">
<IconStyle>
<color>FFFFFFFF</color>
<scale>1.0</scale>
</IconStyle>
</Style>
<Style id="kml">
<LineStyle>
<color>FF0080FF</color>
<width>1</width>
</LineStyle>
<PolyStyle>
<color>AADDDDDD</color>
</PolyStyle>
</Style>
・ ・ ・
</Document>
</kml>
Obwohl einige Teile weggelassen werden, ist das Ziel vorerst KML mit dieser Form. PolyStyle->color Der Wert von ist ** AADDDDDDD **, aber ich möchte dies ändern.
XML-Umschreibprogramm
# -*- coding: utf-8 -*-
from xml.etree import ElementTree
#KML-Datei lesen
tree = ElementTree.parse("in.kml")
#Namespace hinzufügen
#Wenn Sie dies nicht tun, wird ns0 beim Umschreiben allen Tags hinzugefügt.:Werden Sie wie PolyStyle
ElementTree.register_namespace('', 'http://earth.google.com/kml/2.0')
# //PolyStyle/Finde Farbe
for node in tree.findall(".//{http://earth.google.com/kml/2.0}PolyStyle/{http://earth.google.com/kml/2.0}color"):
#Umschreiben von Inhalten
node.text="AA001122"
#Export
#Wenn das dritte Argument wahr ist<?xml ...?>Hinzugefügt.
tree.write("out.kml","UTF-8",True)
PolyStyle->color Der Wert von wird als ** AA001122 ** exportiert.
xml.etree.ElementTree.findall hat am Anfang ein ".". (Es heißt Zukunftswarnung)
Es scheint, dass es eine Teilmenge von XPath verarbeiten kann. http://docs.python.jp/3/library/xml.etree.elementtree.html (Kein Artikel über Python2 gefunden)
Das Problem hier ist der Namespace.
Namensraum
<kml xmlns="http://earth.google.com/kml/2.0">
Befindet sich im Stammverzeichnis, benötigt alles darunter einen Namespace.
Wenn Sie also den Pfad angeben, müssen Sie den Namespace innerhalb von {} hinzufügen und das Tag angeben.
Da es sich um PolyStyle-> Farbe handelt, muss ich es außerdem zweimal schreiben.
xpath
//{http://earth.google.com/kml/2.0}PolyStyle/{http://earth.google.com/kml/2.0}color"
(Bitte lassen Sie mich wissen, ob es einen guten Weg gibt ...)
Als nächstes ist die Bedeutung von register_namespace Das durch Schreiben geschriebene XML
register_Ausgabe ohne Namespace
<ns0:PolyStyle>
<ns0:color>AADDDDDD</ns0:color>
</ns0:PolyStyle>
Vermeiden Sie es, wie zu werden.
Die XPath-Spezifikation ist intelligenter, da es sich um register_namespace handelt Ich frage mich, ob es in beschrieben werden kann (ich muss den Namespace-URI nicht oft schreiben). .. ..
So erhalten Sie das nächste Element mit dem in XPath angegebenen Text http://qiita.com/yuki2006/items/1f96450fc744769872c5
[Python] Gonyogonyo der Namespace von ElementTree http://d.hatena.ne.jp/nullpobug/20110420/1303293319
Recommended Posts