xml.etree.ElementTree http://docs.python.jp/2/library/xml.etree.elementtree.html Utilisez pour analyser xml avec l'espace de noms.
Dans le texte, kml (format utilisé pour Google Earth, etc.) http://ja.wikipedia.org/wiki/KML Est ciblé, mais comme la situation réelle est XML, elle est traitée de la même manière.
KML cible
<?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>
Bien que certaines parties soient omises, pour le moment, la cible est KML qui a cette forme. PolyStyle->color La valeur de est ** AADDDDDDD **, mais je souhaite changer cela.
Programme de réécriture XML
# -*- coding: utf-8 -*-
from xml.etree import ElementTree
#Lire le fichier KML
tree = ElementTree.parse("in.kml")
#Ajouter un espace de noms
#Si vous ne le faites pas, ns0 sera ajouté à toutes les balises lors de la réécriture.:Devenez comme PolyStyle
ElementTree.register_namespace('', 'http://earth.google.com/kml/2.0')
# //PolyStyle/Trouver la couleur
for node in tree.findall(".//{http://earth.google.com/kml/2.0}PolyStyle/{http://earth.google.com/kml/2.0}color"):
#Réécriture de contenu
node.text="AA001122"
#Exportation
#Si le troisième argument est vrai<?xml ...?>Est ajouté.
tree.write("out.kml","UTF-8",True)
PolyStyle->color La valeur de est exportée sous la forme ** AA001122 **.
xml.etree.ElementTree.findall a un "." Au début. (Il s'appelle Future Warning)
Il semble qu'il puisse gérer un sous-ensemble de XPath. http://docs.python.jp/3/library/xml.etree.elementtree.html (Aucun article sur Python2 trouvé)
Le problème ici est l'espace de noms.
Espace de nom
<kml xmlns="http://earth.google.com/kml/2.0">
Est à la racine, donc tout ce qui est en dessous prend un espace de noms.
Ainsi, lorsque vous spécifiez le chemin, vous devez ajouter l'espace de noms à l'intérieur du {} et spécifier la balise.
De plus, comme c'est PolyStyle-> couleur, je dois l'écrire deux fois.
xpath
//{http://earth.google.com/kml/2.0}PolyStyle/{http://earth.google.com/kml/2.0}color"
(S'il vous plaît laissez-moi savoir s'il y a un bon moyen ...)
Ensuite, la signification de register_namespace est Le XML écrit par écriture
register_Sortie sans espace de noms
<ns0:PolyStyle>
<ns0:color>AADDDDDD</ns0:color>
</ns0:PolyStyle>
Évitez de devenir comme.
La spécification XPath est plus intelligente car il s'agit de register_namespace Je me demande si cela peut être décrit dans (je n'ai pas à écrire l'URI de l'espace de noms plusieurs fois). .. ..
Comment obtenir l'élément suivant avec le texte spécifié dans XPath http://qiita.com/yuki2006/items/1f96450fc744769872c5
[Python] Gonyogonyo l'espace de noms d'ElementTree http://d.hatena.ne.jp/nullpobug/20110420/1303293319
Recommended Posts