Die Geschichte des Lesens von XML mit Python kam herein, also habe ich sie untersucht. Einige der XML-Tags, mit denen wir uns befassen, haben den Format-Namespace: tag_name. Ich konnte das Tag mit dem Namespace nicht gut finden, also habe ich den Code zusammengestellt.
Ich habe die Beispielcode-URL nicht hinzugefügt, also habe ich sie hinzugefügt. Beispielcode
Wenn es PHP ist, kann es mit simplexml_load_string gelesen werden. Im Falle von PHP wird es in Namespace_Tag_Name konvertiert, sodass Sie nach Knoten suchen können, ohne sich darum kümmern zu müssen.
In Python können Sie nur suchen, wenn Sie den Namespace im Voraus in einem Array speichern und das Array des Namespace übergeben, wenn Sie die Suchfunktion ausführen.
Deshalb liest man XML mit Namespace
Ziehen Sie zunächst den Inhalt des zu lesenden XML heraus. Dies ist die Tag-Struktur.
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>
Python-Skript zum Lesen dieses XML
ReadXMLSample.py
from pprint import pprint
import os
import xml.etree.ElementTree as ET
#Registrieren Sie jeden in XML angegebenen NameSpace
# xmlns:fme="http://www.safe.com/gml/fme"das ist'fme' : 'http://www.safe.com/gml/fme'Wird
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()
#Holen Sie sich srsName des Attributs
pprint ("envelope = " + root.find('gml:boundedBy/gml:Envelope', ns).attrib['srsName'].strip())
# gml:Ich möchte das folgende FeatureMember erhalten
fmeNodes = root.findall('gml:featureMember', ns)
records = []
for itemNode in fmeNodes:
#Wenn Sie den Wert des Knotens unterhalb der Wurzel haben möchten, können Sie den Wert erhalten, indem Sie den Pfad von der Wurzel beschreiben
#Vergessen Sie nicht, eine Reihe von Namespaces anzugeben, wenn Sie finden!
pprint ("KEN_ID = " + itemNode.find('fme:MESH03622/fme:KEN_ID', ns).text.strip())
#Kann durch Angabe eines relativen Pfads basierend auf dem aktuellen itemNode erhalten werden
pprint ("KEN_ID = " + itemNode.find('.//fme:KEN_ID', ns).text.strip())
#Wenn Sie die Punktliste erhalten möchten, beschreiben Sie den Pfad auf die gleiche Weise.
pprint ("posList = " + itemNode.find('fme:MESH03622/gml:surfaceProperty/gml:Surface/gml:patches/gml:PolygonPatch/gml:exterior/gml:LinearRing/gml:posList', ns).text.strip())
#Unterbrechen Sie die Arbeit, damit die Daten nicht zu stark fließen
break
Es gibt verschiedene Möglichkeiten, es zu lesen, aber Sie können es mit dem relativen Pfad oder dem absoluten Pfad aus dem Lese-Tag angeben. Ich frage mich, ob ich so denken sollte.
Recommended Posts