2013-03-12 4 views
5

Ich habe ein Skript geschrieben, das alle XML-Dateien im aktuellen Verzeichnis im XML-Format ausgibt, aber ich kann nicht herausfinden, wie die xmlns-Attribute zum Level-Tag. Der Ausgang I zu bekommen ist:Python: Hinzufügen von XML-Schemaattributen mit lxml

<?xml version='1.0' encoding='utf-8'?> 
<databaseChangeLog 
     xmlns="http://www.host.org/xml/ns/dbchangelog" 
     xmlns:xsi="http://www.host.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="www.host.org/xml/ns/dbchangelog"> 

    <include file="cats.xml"/> 
    <include file="dogs.xml"/> 
    <include file="fish.xml"/> 
    <include file="meerkats.xml"/> 

</databaseChangLog> 

Hier ist jedoch die Ausgabe erhalte ich:

<?xml version='1.0' encoding='utf-8'?> 
<databaseChangeLog> 
    <include file="cats.xml"/> 
    <include file="dogs.xml"/> 
    <include file="fish.xml"/> 
    <include file="meerkats.xml"/> 
</databaseChangLog> 

Hier ist mein Skript:

import lxml.etree 
import lxml.builder 
import glob 

E = lxml.builder.ElementMaker() 
ROOT = E.databaseChangeLog 
DOC = E.include 

# grab all the xml files 
files = [DOC(file=f) for f in glob.glob("*.xml")] 
the_doc = ROOT(*files) 

str = lxml.etree.tostring(the_doc, pretty_print=True, xml_declaration=True, encoding='utf-8') 

print str 

ich einige gefunden habe online Beispiele für das explizite Setzen von Namespace-Attributen, here und here, aber um ehrlich zu sein, gingen sie ein wenig über meinen Kopf, als ich gerade erst anfing. Gibt es eine andere Möglichkeit, diese xmlns-Attribute zum databaseChangeLog-Tag hinzuzufügen?

Antwort

8
import lxml.etree as ET 
import lxml.builder 
import glob 

dbchangelog = 'http://www.host.org/xml/ns/dbchangelog' 
xsi = 'http://www.host.org/2001/XMLSchema-instance' 
E = lxml.builder.ElementMaker(
    nsmap={ 
     None: dbchangelog, 
     'xsi': xsi}) 

ROOT = E.databaseChangeLog 
DOC = E.include 

# grab all the xml files 
files = [DOC(file=f) for f in glob.glob("*.xml")] 

the_doc = ROOT(*files) 
the_doc.attrib['{{{pre}}}schemaLocation'.format(pre=xsi)] = 'www.host.org/xml/ns/dbchangelog' 

print(ET.tostring(the_doc, 
        pretty_print=True, xml_declaration=True, encoding='utf-8')) 

Ausbeuten

<?xml version='1.0' encoding='utf-8'?> 
<databaseChangeLog xmlns:xsi="http://www.host.org/2001/XMLSchema-instance" xmlns="http://www.host.org/xml/ns/dbchangelog" xsi:schemaLocation="www.host.org/xml/ns/dbchangelog"> 
    <include file="test.xml"/> 
</databaseChangeLog> 
+0

, dass dank arbeitete so viel! Würdest du zufällig wissen, wie man die Ausgabe formatiert, ähnlich wie in meiner oben erwünschten Ausgabe? Ich dachte pretty_print könnte dabei helfen, aber es scheint nicht zu helfen :( – user1420913

+0

Entschuldigung, ich kenne keinen robusten Weg, das zu tun. – unutbu

+0

Kein Problem, danke für Ihre Hilfe :) – user1420913