2 Stimmen

Wie erstelle ich große XML-Dokumente im Speicher mit Python unter Verwendung der Standardbibliothek?

Ich versuche, eine große XML-Datei im Speicher zu erstellen, die in ein Blob-Feld in einer ESRI-Feature-Class eingefügt wird.

Ich habe versucht, ElementTree zu verwenden, aber Python ist schließlich abgestürzt. Wahrscheinlich habe ich es nicht auf die beste Weise gemacht. Ein Beispiel für meinen Code (nicht genau):

mit update_cursor auf Feature-Class:
    for Zeile in update_cursor:
        root = Element("root") 
        tree = ElementTree(root)
        for id in id_list:
            if Zeile[0] in id:
               equipment = Element("equipment") 
               root.append(equipment)

               attrib1 = Element("attrib1")
               equipment.append(attrib1)
               attrib1.text = "myattrib1"

               attrib2 = Element("attrib2")
               equipment.append(attrib2)
               attrib2.text = "myattrib2"

               ....und ungefähr 5 weitere davon an equipment angehängt

        xml_daten = ET.tostring(root)

        xml_daten in Blob-Feld einfügen

Beispiel für das XML:

    Eins
    Zwei
    Drei
    ...
    Zehn

    Eins
    Zwei
    Drei
    ...
    Zehn

Jetzt ist mir klar, dass dies wahrscheinlich eine ziemlich amateurhafte Art ist, dies zu tun, aber ich bin mir nicht sicher, wie ich diese XML im Speicher am besten aufbauen soll.

Für jede Zeile im update_cursor könnten mehrere "equipment"-Elemente zum root hinzugefügt werden, und jedes "equipment"-Element wird die exakt gleichen untergeordneten Elemente haben, aber mit unterschiedlichen Attributen.

Ich habe das ausgeführt und es gab ungefähr 200 IDs, die mit einer einzelnen Zeile übereinstimmten, also musste es das equipment-Element und alle Kinder des equipment 200 Mal im Speicher erstellen.

Was ist also der beste Weg, um XML im Speicher mit Python und einer Standardbibliothek zu erstellen?

2voto

Ben Punkte 2312

Ihre Datenstruktur scheint sehr einfach zu sein. Verwenden Sie keine XML-Bibliothek. Schreiben Sie einfach Ihre Zeilen direkt in ein cStringIO.StringIO.

mit update_cursor auf Feature-Class:
    für Zeile in update_cursor:
        buffer = cStringIO.StringIO()
        buffer.write("\n")
        für id in id_list:
            if row[0] in id:
               buffer.write("    \n")
               buffer.write("        One\n")
               buffer.write("        Two\n")
               buffer.write("        Three\n")

               ....und etwa 5 weitere davon an equipment angehängt

               buffer.write("    \n")

        buffer.write("\n")

        xml_data = buffer.getvalue()

        füge xml_data in das Blob-Feld ein

2voto

Bertrand Croq Punkte 21

Sie können ET.SubElement verwenden, um Elemente zu erstellen und anzuhängen:

ausrüstung = ET.SubElement(root, "ausrüstung")
ET.SubElement(ausrüstung, "attrib1").text = "Eins"
ET.SubElement(ausrüstung, "attrib2").text = "Zwei"
ET.SubElement(ausrüstung, "attrib3").text = "Drei"
...

Es ist kürzer und klarer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X