L'histoire de la lecture de XML avec Python est arrivée, alors je l'ai étudiée. Certaines des balises XML que nous traitons sont au format namespace: nom_tiquette. Je n'ai pas bien trouvé la balise avec l'espace de noms, alors j'ai rassemblé le code.
Je n'ai pas ajouté l'exemple d'URL de code, je l'ai donc ajouté. Exemple de code
S'il s'agit de php, il peut être lu avec simplexml_load_string. Dans le cas de php, il est converti en namespace_tag_name, vous pouvez donc rechercher des nœuds sans vous en soucier.
En python, vous ne pouvez pas rechercher à moins de stocker l'espace de noms dans un tableau à l'avance et de transmettre le tableau d'espace de noms lors de l'exécution de la fonction de recherche.
C'est pourquoi comment lire du XML avec un espace de noms
Tout d'abord, extrayez le contenu du XML à lire. C'est la structure des balises.
MESH03622.gml
<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection xmlns:fme="http://www.safe.com/gml/fme" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.safe.com/gml/fme MESH03622.xsd">
<gml:boundedBy>
<gml:Envelope srsName="EPSG:4612" srsDimension="2">
<gml:lowerCorner>24.4333333329177 122.924999999934</gml:lowerCorner>
<gml:upperCorner>24.4833333336014 123.000000000218</gml:upperCorner>
</gml:Envelope>
</gml:boundedBy>
<gml:featureMember>
<fme:MESH03622 gml:id="id060c8300-20cf-4750-b6a6-6b9730bc8fb3">
<fme:FID>0</fme:FID>
<fme:KEN_ID>47</fme:KEN_ID>
<fme:KEY_CODE>36225734</fme:KEY_CODE>
<fme:MESH1_ID>3622</fme:MESH1_ID>
<fme:MESH2_ID>57</fme:MESH2_ID>
<fme:MESH3_ID>34</fme:MESH3_ID>
<gml:surfaceProperty>
<gml:Surface srsName="EPSG:4612" srsDimension="2">
<gml:patches>
<gml:PolygonPatch>
<gml:exterior>
<gml:LinearRing>
<gml:posList>24.4416666664184 122.925000000467 24.4500000000747 122.924999999934 24.4500000002353 122.937499999765 24.4416666669395 122.937499999636 24.4416666664184 122.925000000467</gml:posList>
</gml:LinearRing>
</gml:exterior>
</gml:PolygonPatch>
</gml:patches>
</gml:Surface>
</gml:surfaceProperty>
</fme:MESH03622>
</gml:featureMember>
Script Python pour lire ce XML
ReadXMLSample.py
from pprint import pprint
import os
import xml.etree.ElementTree as ET
#Enregistrez chaque espace de nom spécifié dans XML
# xmlns:fme="http://www.safe.com/gml/fme"c'est'fme' : 'http://www.safe.com/gml/fme'Devient
ns = {'gml': 'http://www.opengis.net/gml', 'fme': 'http://www.safe.com/gml/fme', 'xlink': 'http://www.w3.org/1999/xlink'}
tree = ET.parse(fileName)
root = tree.getroot()
#Obtenir srsName de l'attribut
pprint ("envelope = " + root.find('gml:boundedBy/gml:Envelope', ns).attrib['srsName'].strip())
# gml:Je souhaite bénéficier de la fonctionnalité suivante
fmeNodes = root.findall('gml:featureMember', ns)
records = []
for itemNode in fmeNodes:
#Si vous voulez la valeur du nœud sous la racine, vous pouvez obtenir la valeur en décrivant le chemin à partir de la racine
#N'oubliez pas de spécifier un tableau d'espaces de noms lorsque vous trouvez!
pprint ("KEN_ID = " + itemNode.find('fme:MESH03622/fme:KEN_ID', ns).text.strip())
#Peut être obtenu en spécifiant un chemin relatif basé sur l'élément itemNode actuel
pprint ("KEN_ID = " + itemNode.find('.//fme:KEN_ID', ns).text.strip())
#Si vous souhaitez obtenir la liste de points, décrivez le chemin de la même manière.
pprint ("posList = " + itemNode.find('fme:MESH03622/gml:surfaceProperty/gml:Surface/gml:patches/gml:PolygonPatch/gml:exterior/gml:LinearRing/gml:posList', ns).text.strip())
#Pause pour plus de commodité afin que les données ne circulent pas trop
break
Il existe plusieurs façons de le lire, mais vous pouvez le spécifier avec le chemin relatif ou le chemin absolu de la balise de lecture. Je me demande si je devrais penser de cette façon.
Recommended Posts