Elementtree Einstellung die Reihenfolge der attribute
Ich versuche zu schreiben, ein python-Skript zur Standardisierung von generischen XML-Dateien zum konfigurieren von websites und website-Formulare. Aber dazu würde ich gerne entweder halten die ursprüngliche Attribut-Reihenfolge der Elemente, oder noch besser in der Lage sein, um Sie neu anzuordnen, die in einer vorgegebenen Art und Weise. Momentan werden die meisten xml-Parser, die ich habe versucht, re-schreiben Sie das Attribut, um sein alpha-numerisch. Wie diese XML-Dateien sind menschliche gelesen/geschrieben und gewartet wird, ist dies nicht allzu sinnvoll.
Beispielsweise ein generisches element Aussehen kann, wie dies in der XML;
<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X">
Jedoch einmal Durchlaufen elementtree und neu geschrieben, um eine neue Datei dies geändert:
<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text">
Als Ziel des Skript ist die Vereinheitlichung einer großen Anzahl von XML-Dateien, um zu erhöhen die Lesbarkeit zwischen den Kollegen und, dass die Informationen innerhalb des Elements Attribute haben unterschiedliche Ebenen von Bedeutung (ZB. QuestionRef ist sehr wichtig), dicates, dass die Attribute müssen sinnvoll angeordnet.
Ich verstehe, dass python-dicts (die Attribute werden gespeichert) sind natürlich verdreht und XML-Spezifikation besagt Attributreihenfolge ist unbedeutend, aber das die menschliche Lesbarkeit Faktor ist die treibende Kraft hinter der Schrift.
In anderen Fragen (auf Stack Overflow), ähnlich wie diese die ich gesehen habe, bemerkte er, dass pxdom können dies tun (Frage link: link), aber ich finde keine Erwähnung von, wie kann es dazu in pxdom Dokumentation oder über eine google-Suche. So ist es eine Möglichkeit, die zur Aufrechterhaltung der Reihenfolge der Attribute oder definieren Sie mit aktuellen XML-Parser? Vorzugsweise ohne Rückgriff auf hotpatching :)!
Jede Hilfe, die jeden bieten kann, wäre sehr dankbar :).
- Meine erste, obwohl, ist, dass vielleicht sollten Sie ein anderes Dateiformat (wie yaml?) für menschliche Bearbeitung - und dann zu übersetzen, dass die XML-falls erforderlich-Systemen...
- Wenn die Reihenfolge der Attribute ist wichtig, haben Sie sich überlegt mit sub-Elementen (e.g:
<Availability>Shown</Availability>
) statt? Es, die Reihenfolge ist definitiv beibehalten. - Problem ist die XML-übergabe an C# - code generiert der websites in HTML und javscript. Dieser code wurde entwickelt werden, die über etwa 5 Jahre, also eher unhandlich. Daher Wechsel von XML ist nicht möglich, da die Bewegung der Verfügbarkeit zu einem sub-element. Danke für die Hilfe aber 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gelten monkey patch, wie unten erwähnt: aus:
in
ElementTree.py
- Datei gibt es eine Funktion namens als_serialize_xml
;in dieser Funktion; Anwendung der unten genannten patch;
hier; entfernen Sie die
sorted(items)
und machen es nuritems
wie ich es getan habe vor.Auch deaktivieren Sie die Sortierung basiert auf der namespace - (, weil in den oben genannten patch; die Sortierung ist immer noch vorhanden, wenn der namespace für das xml-Attribut; andernfalls, wenn namespace nicht vorhanden ist; dann oben ist in Ordnung); also das zu tun, müssen Sie alle
{}
mitcollections.OrderedDict()
ausElementTree.py
Jetzt haben Sie alle Attribute in einer Reihenfolge, wie Sie Hinzugefügt haben, um das xml-element.
Bevor Sie das tun alle der oben genannten, Lesen Sie die copyright-Meldung von Fredrik Lundh, der sich in
ElementTree.py