Frage

Ich versuche, XML mit der ElementTree -Objektstruktur in Python zu erstellen. Es funktioniert alles sehr gut, außer wenn es um die Verarbeitung von Anweisungen geht. Ich kann einen PI einfach mit der Werksfunktion processingInstruction () erstellen, aber es wird nicht in das ElementTree hinzugefügt. Ich kann es manuell hinzufügen, aber ich kann nicht herausfinden, wie ich es über das Wurzelelement hinzufügen kann, in dem PI normalerweise platziert werden. Weiß jemand, wie man das macht? Ich kenne viele alternative Methoden, um es zu tun, aber es scheint, dass dies irgendwo eingebaut werden muss, was ich einfach nicht finden kann.

War es hilfreich?

Lösung

Versuchen Sie das lxml Bibliothek: Es folgt der ElementTree -API und fügt viele Extras hinzu. Von dem Kompatibilitätsübersicht:

ElementTree ignoriert Kommentare und Verarbeitungsanweisungen bei der Parsen von XML, während ETREE sie einlesen und sie als Kommentar- bzw. RecessingInstruction -Elemente behandelt. Dies ist besonders sichtbar, wenn Kommentare in Textinhalten gefunden werden, die dann vom Kommentarelement geteilt werden.

Sie können dieses Verhalten deaktivieren, indem Sie den Booleschen Verabschiedung haben remove_comments und/oder remove_pis Schlüsselwortargumente an den von Ihnen verwendeten Parser. Um einen praktischen Code zu unterstützen, können Sie auch die verwenden etree.ETCompatXMLParser statt der Standardeinstellung etree.XMLParser. Es versucht, ein Standard -Setup bereitzustellen, das dem ElementTree -Parser so nahe wie möglich liegt.

Nicht in der STDLIB, ich weiß, aber meiner Erfahrung nach ist die beste Wahl, wenn Sie Dinge benötigen, die der Standard -Elementtree nicht bietet.

Andere Tipps

Mit der LXML -API könnte es nicht einfacher sein, obwohl es ein bisschen "unterdokumentiert" ist:

Wenn Sie eine Verarbeitungsanweisung auf höchstem Niveau benötigen, erstellen Sie sie so:

from lxml import etree

root = etree.Element("anytagname")
root.addprevious(etree.ProcessingInstruction("anypi", "anypicontent"))

Das resultierende Dokument sieht folgt aus:

<?anypi anypicontent?>
<anytagname />

Sie sollten dies sicher zu ihren FAQ hinzufügen, denn IMO ist eine weitere Funktion, die diese schöne API auszeichnet.

Ja, ich glaube nicht, dass es möglich ist, sorry. ElementTree bietet eine einfachere Schnittstelle zur (nicht namedspatierten) elementorientierten XML-Verarbeitung als DOM, aber der Preis dafür ist, dass es nicht das gesamte XML-Infoset unterstützt.

Es gibt keinen offensichtlichen Weg, um den Inhalt darzustellen, der außerhalb des Wurzelelements lebt (Kommentare, PIS, DOCTYPE und die XML -Erklärung), und diese werden auch zum Zeitpunkt der Analyse verworfen. (Abgesehen davon: Dies scheint alle in der internen DTD-Untergruppe angegebenen Standardattribute enthalten zu sein, wodurch ElementTree einen nicht konformen XML-Prozessor ausschließlich sprechend macht.)

Sie können wahrscheinlich durch Subklassigen oder Affe-Anpatching der Python Native ElementTree-Implementierung arbeiten write() Methode zum Aufrufen _write auf Ihren zusätzlichen PIs vor _writeing das _root, aber es könnte ein bisschen zerbrechlich sein.

Wenn Sie Unterstützung für das vollständige XML -Infoset benötigen, bleiben Sie wahrscheinlich am besten bei DOM.

Ich weiß nicht viel über Elementtree. Es ist jedoch möglich, dass Sie Ihr Problem mit einer Bibliothek mit dem Titel "XE" lösen können.

XE ist eine Reihe von Python -Klassen, die es einfach machen, strukturierte XML zu erstellen. Ich habe aus verschiedenen Gründen schon lange nicht mehr daran gearbeitet, aber ich wäre bereit, Ihnen zu helfen, wenn Sie Fragen dazu haben oder Fehler benötigen.

Es hat die nackten Knochen der Unterstützung für Dinge wie Verarbeitungsanweisungen und mit ein wenig Arbeit könnte ich denke, dass es das tun könnte, was Sie brauchen. (Als ich anfing, Verarbeitungsanweisungen hinzuzufügen, habe ich sie nicht wirklich verstanden und ich hatte keine Notwendigkeit für sie, sodass der Code eine Art halbherziger ist.)

Schauen Sie sich an und sehen Sie, ob es nützlich erscheint.

http://home.avvanta.com/~steveha/xe.html

Hier ist ein Beispiel dafür:

import xe
doc = xe.XMLDoc()

prefs = xe.NestElement("prefs")
prefs.user_name = xe.TextElement("user_name")
prefs.paper = xe.NestElement("paper")
prefs.paper.width = xe.IntElement("width")
prefs.paper.height = xe.IntElement("height")

doc.root_element = prefs


prefs.user_name = "John Doe"
prefs.paper.width = 8
prefs.paper.height = 10

c = xe.Comment("this is a comment")
doc.top.append(c)

Wenn Sie den oben genannten Code ausgeführt haben und dann gelaufen sind print doc Hier ist, was Sie bekommen würden:

<?xml version="1.0" encoding="utf-8"?>
<!-- this is a comment -->
<prefs>
    <user_name>John Doe</user_name>
    <paper>
        <width>8</width>
        <height>10</height>
    </paper>
</prefs>

Wenn Sie daran interessiert sind, aber Hilfe benötigen, lassen Sie es mich einfach wissen.

Viel Glück mit Ihrem Projekt.

f = open('D:\Python\XML\test.xml', 'r+')
old = f.read()
f.seek(44,0)      #place cursor after xml declaration
f.write('<?xml-stylesheet type="text/xsl" href="C:\Stylesheets\expand.xsl"?>'+ old[44:])

Ich hatte das gleiche Problem und hatte diese grobe Lösung, nachdem ich den PI nicht korrekt in die .xml -Datei eingefügt hatte, auch nachdem in meinem Fall eine der Elementmethoden verwendet wurde root.insert (0, PI) und mehrere Möglichkeiten zum Ausschneiden und Einfügen des eingefügten PI an den richtigen Ort, um nur die Daten zu finden, die von unerwarteten Orten gelöscht werden sollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top