StringIO und Pfad im Dateisystem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Noch schnell eine Frage:
Ich habe verschiedene XML-Dateien:

Einmal korrekte XMLs, d.h. mit Header und allem drum und dran. <-- Keine Probleme.
Zum Anderen habe ich XMLs nur mit "Inhalt", also ohne Header drumrum. <-- Hierum gehts.

Die XMLs, welche keinen Header besitzen werden in Python mittels Template mit einem Header versehen.
Diese generierten XMLs möchte ich durch den lxml parser jagen. Hierzu erstelle ich mir aus dem Inhalt ein StringIO-Objekt.
Mein Problem ist, dass diese so generierten XMLs ja jetzt keinen Pfad im Verzeichnis besitzen, sondern einfach irgendwo in der Pythonwelt als Objekte herumschwirren...
Wenn nun ein XInclude darauf ausgeführt werden soll, können die einzubindenden Dateien nicht gefunden werden, da diese nur eine relative Pfadangabe besitzen.

Jetzt meine Frage:
Ist es möglich dem StringIO-Objekt einen Pfad im Dateisystem zuzuweisen? Sozusagen ihm vorgaukeln, dass es unter z.B. C:/test/StringIO.xml liegt?
Ich habe es im Moment so gelöst, dass ich mir eine temporäre Datei generieren lasse, diese dann parse und am schluss die Datei wieder lösche, aber das ist finde ich nicht sonderlich schön. Oder ist das etwar doch die einzige Möglichkeit?

Nochmal n bischen genauer:

Ein StringIO-Objekt hält den Inhalt einer XML Datei, die unter anderem auch ein XInclude-Element enthält:

Code: Alles auswählen

<xi:include href="../xzy/includeThis.xml" parse="xml"/>
lxml kann so aber nicht den Pfad zur Datei "includeThis.xml" finden, da das StringIO-Objekt ja nicht in diesem Verzeichnis liegt...


Grüße
m0ps
BlackJack

@m0ps1234: Warum der Umweg über ein `StringIO`-Objekt? `lxml.etree.parsestring()` hat ein `base_url`-Argument.
m0ps1234
User
Beiträge: 40
Registriert: Freitag 13. März 2009, 08:57

Frag mich jetzt auch, warum ich den Umweg über das StringIO nehm... ;)
Vielen Dank!
Antworten