Manipuler XML avec des espaces de noms en Python (arbre des éléments)

en premier

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.

Données cibles

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.

Code programme

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 **.

Commentaire

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.

Yurubo

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). .. ..

référence

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

Manipuler XML avec des espaces de noms en Python (arbre des éléments)
Analyser XML en Python
Lire du XML avec un espace de noms spécifié en Python
Manipuler des fichiers et des dossiers en Python
Compilateur en Python: arborescence de syntaxe PL / 0
Manipuler les noms de fichiers OCTA udf en Python
Algorithme (arborescence de segments) en Python (s'entraîner)
Élément de zone rectangulaire divisé en Python
Arborescence de sortie des fichiers en Python
Arborescence de segments retardée en Python (demande de débogage)
Obtenez la probabilité de précipitation de XML avec Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Géocodage en python
SendKeys en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
Compilateur en Python: Arbre de syntaxe abstraite PL / 0 (AST)
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
2. Analyse multivariée expliquée dans Python 7-3. Arbre de décision [arbre de retour]
[Python] Récupère l'élément en spécifiant l'attribut name dans BeautifulSoup
2. Analyse multivariée décrite dans Python 7-1. Arbre de décision (scikit-learn)
Je veux manipuler des chaînes dans Kotlin comme Python!
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python
Daily AtCoder # 6 en Python