aus XML-Datei Daten ausgelesen - nun neue reinschreiben
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Das der Kommentar nicht auftaucht ist ja nicht verwunderlich, denn du hast ihn ja auch nicht zum Tree hinzugefügt; der Kommentar ist also "freifliegend" - er weiß ja nicht mal zu welchem Baum er gehören sollte.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Klingt logisch, nur irgendwie weiß ich im Moment grad nicht, wo ich das anhängen soll.
Irgendwie häng ich grad.
Daniela
Code: Alles auswählen
doc = open('datei.rm', 'rw')
tree = etree.parse(doc) # einlesen der vorhandenen XML-Datei
root = tree.getroot() # Bestimmung des Wurzelelements
stations = tree.getroot().find("stations") # erster Knoten wird ausgelesen
kommentar = etree.Comment("DOCTYPE roadmap SYSTEM \"roadmap.dtd\"") # wo muss der rangehängt werden?
...
tree = etree.ElementTree(root)
tree.write('datei.rm', encoding='UTF-8')
Daniela
Ich wüsste nur diese Lösung:
Code: Alles auswählen
In [16]: r = ET.Element("root")
In [17]: k = ET.Comment("Ich bin der Kommentar!")
In [18]: r.insert(0, k)
In [19]: ET.tostring(r)
Out[19]: '<root><!-- Ich bin der Kommentar! --></root>'
Danke dafür, es funktioniert.
wenn ich jetzt (noch) einen Docstring einfügen will, nach dem Muster
würde ich das so machen:
Aber hier bekomme ich folgendes dann zurück:
Wird der Docstring anders aufgerufen, bzw. die Klammern anders gefüllt? Ich hab mich an das gehalten, was in der API steht. Nur mit der "0" war ich mir nicht sicher. Eigentlich brauch ich die auch nicht.
Daniela
wenn ich jetzt (noch) einen Docstring einfügen will, nach dem Muster
Code: Alles auswählen
<!DOCTYPE bla SYSTEM "keks.dtd">
Code: Alles auswählen
dockommentar = etree.XMLTreeBuilder.doctype('bla', 0, "keks.dtd")
Code: Alles auswählen
TypeError: unbound method doctype() must be called with XMLTreeBuilder instance as first argument (got str instance instead)
Daniela
Das mit dem Kommentar einfügen funktioniert ja soweit, nur dummerweise hatte ich übersehen, dass in das was ich da einfügen will kein Kommentar ist, sondern "Doctype-Deklaration".
im Elementtree-Modul gibt es ja die XML-TreeBuilder Objekte und mit diesem scheint man eigene Doctypes erstellen zu können, nur stellt sich für mich hier die Frage wie.
Denn die allgemeine Syntax sieht ja folgendes vor:
Nur ich muss in meiner Datei nur einen Namen und das System angeben, ohne die "pubid".
Ich hab hier auch im Forum schon gelesen, dass solche Konstrukte "per Hand" eingefügt werden sollen/sollten. Nur kann ich mir nicht wirklich vorstellen, dass das so gut sein soll.
Gibt es irgendwie die Möglichkeit die Zeile entweder gleich aus der bestehenden Datei mit auszulesen, und dann in eine neue Datei mit reinzuschreiben, oder aber so in die neu zuschreibende Datei einfügen, dass es hinter der Kodierungszeile ist, aber vor der Wurzel des XML-Baums?
Danke schonmal für eure Hinweise
Daniela
im Elementtree-Modul gibt es ja die XML-TreeBuilder Objekte und mit diesem scheint man eigene Doctypes erstellen zu können, nur stellt sich für mich hier die Frage wie.
Denn die allgemeine Syntax sieht ja folgendes vor:
Code: Alles auswählen
doctype(name, pubid, system)
#Handles a doctype declaration. name is the doctype name. pubid is the public identifier. system is the system identifier.
Ich hab hier auch im Forum schon gelesen, dass solche Konstrukte "per Hand" eingefügt werden sollen/sollten. Nur kann ich mir nicht wirklich vorstellen, dass das so gut sein soll.
Gibt es irgendwie die Möglichkeit die Zeile entweder gleich aus der bestehenden Datei mit auszulesen, und dann in eine neue Datei mit reinzuschreiben, oder aber so in die neu zuschreibende Datei einfügen, dass es hinter der Kodierungszeile ist, aber vor der Wurzel des XML-Baums?
Danke schonmal für eure Hinweise
Daniela
So ich hab mich jetzt mal daran versucht, das zu befolgen, was Y0Gi (vor einer Weile) geschrieben hat zu befolgen:
Ich hab aber auch noch die Methode ``concat`` im Modul ``Operator`` gefunden, welche ja das gleiche Ergebniss liefert. Oder bin ich jetzt auf dem Holzweg.
Jedenfalls durch diese Verknüpfung (entweder +-Zeichen, oder conat-Methode) ist nun der Header mit entsprechender DOCTYPE-Anweisung/Deklaration in einem String gespeichert.
Wie kriege ich jetzt diesen (langen) String in eine Datei geschrieben/gespeichert?
Sorry übrigends für mein Dreifach-Posting, aber ich arbeite mich eben langsam an die Lösung ran.
Für Hinweise oder Vorschläge wäre ich sehr dankbar.
Daniela
Hab ich gemacht. mein komplettes XML-dokument ist nun in einem StringY0Gi hat geschrieben:Mit ET kannst du einfach ein neues `Element` anlegen und das als Root verwenden, indem du einfach `SubElement`e dranhängst. Über das Root-Element wandelst du abschließend das Dokument in einen String um (mit der Funktion `tostring`)
Code: Alles auswählen
wurzel = etree.tostring(root)
String-Konkatenation ist doch eigentlich nur das Verknüpfen 2er Strings mit einem "+"-Zeichen, oder???Y0Gi hat geschrieben:und kannst dann über normale String-Konkatenation den gewünschten Header davor setzen.
Ich hab aber auch noch die Methode ``concat`` im Modul ``Operator`` gefunden, welche ja das gleiche Ergebniss liefert. Oder bin ich jetzt auf dem Holzweg.
Jedenfalls durch diese Verknüpfung (entweder +-Zeichen, oder conat-Methode) ist nun der Header mit entsprechender DOCTYPE-Anweisung/Deklaration in einem String gespeichert.
Code: Alles auswählen
zsgf = header + baum
Sorry übrigends für mein Dreifach-Posting, aber ich arbeite mich eben langsam an die Lösung ran.
Für Hinweise oder Vorschläge wäre ich sehr dankbar.
Daniela
Lies noch einmal die Fehlermeldung und dann mach mal folgendes:Daniela hat geschrieben:Aber hier bekomme ich folgendes dann zurück:Code: Alles auswählen
dockommentar = etree.XMLTreeBuilder.doctype('bla', 0, "keks.dtd")
Code: Alles auswählen
TypeError: unbound method doctype() must be called with XMLTreeBuilder instance as first argument (got str instance instead)
Code: Alles auswählen
print etree.XMLTreeBuilder
print etree.XMLTreeBuilder()
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Jein. Die Funktionen die in ``operator`` definiert sind, sind eigentlich nicht dafür gedacht direkt aufgerufen zu werden, dafür gibt es ja die normalen Operatoren. Sie sind vielmehr dazu gedacht in partielle Funktionen oder als Funktionen höherer Ordnung verwendet zu werden; sie direkt zu verwenden geht ist aber unnötig kompliziert.Daniela hat geschrieben:String-Konkatenation ist doch eigentlich nur das Verknüpfen 2er Strings mit einem "+"-Zeichen, oder???Y0Gi hat geschrieben:und kannst dann über normale String-Konkatenation den gewünschten Header davor setzen.
Ich hab aber auch noch die Methode ``concat`` im Modul ``Operator`` gefunden, welche ja das gleiche Ergebniss liefert. Oder bin ich jetzt auf dem Holzweg.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Ja, ich hab nie mit der Instanz gearbeitet.DasIch hat geschrieben:Lies noch einmal die Fehlermeldung und dann mach mal folgendes:Fällt dir etwas auf?Code: Alles auswählen
print etree.XMLTreeBuilder print etree.XMLTreeBuilder()
Was ich aber trotzdem bei der Deklarierung von doctype nicht verstehe, ist dieser "public identifier". Besteht dieser einfach aus einer Zahl, Zeichenkette, oder sonst was? Was muss man angeben, wenn man ihn eigentlich nicht haben will/braucht? Irgendwas muss man ja angeben, sonst kommt folgendes zurück:
Code: Alles auswählen
dockommentar = etree.XMLTreeBuilder().doctype('bla', "keks.dtd")
TypeError: doctype() takes exactly 4 arguments (3 given)
Bisher hab ich es so geschrieben:
Code: Alles auswählen
dockommentar = etree.XMLTreeBuilder().doctype('bla', "public", "keks.dtd")
Denn nach dem Schema von Zap funktioniert es nicht.
Code: Alles auswählen
dockommentar = etree.XMLTreeBuilder().doctype('bla','public', "keks.dtd")
etree.insert(0, dockommentar)
etree.tostring(root)
Code: Alles auswählen
AttributeError: 'module' object has no attribute 'insert'
@Leonidas
gut zu wissen. Danke für den Hinweis
Daniela