2013-03-12 11 views
5

Napisałem skrypt, który wypisze wszystkie pliki .xml w bieżącym katalogu w formacie xml, ale nie mogę wymyślić, jak dodać atrybuty xmlns do góry znacznik poziomu. Wyjście chcę uzyskać to:Python: dodawanie atrybutów schematu XML za pomocą 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> 

Jednak tutaj jest wyjście otrzymuję:

<?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> 

Oto mój skrypt:

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 

Znalazłem jakiś przykłady online jawnie ustawiające atrybuty przestrzeni nazw, here i here, ale szczerze mówiąc, przeszły trochę ponad moją głowę, kiedy dopiero zaczynam. Czy istnieje inny sposób dodawania tych atrybutów xmlns do znacznika databaseChangeLog?

Odpowiedz

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')) 

plony

<?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

To działało, dzięki tak dużo! Czy wiesz, jak sformatować wyjście podobne do tego, co jest w moich pożądanych wynikach powyżej? Pomyślałem, że pretty_print może pomóc w tym, ale to nie pomaga :( – user1420913

+0

Niestety, nie wiem na temat solidnego sposobu, aby to zrobić – unutbu

+0

Nie ma problemu, dziękuję za pomoc :) – user1420913