2011-09-05 14 views
6

Próbuję utworzyć dokument XML w pamięci tak, że wszystkie węzły podrzędne root'a wymagają przestrzeni nazw.Tworzenie dokumentu xml z pythonem/ElementTree i przestrzeniami nazw

Dokument końcowy powinien wyglądać mniej więcej tak:

<Feed>    
<FeedEntity Id="0000" 
     xmlns="http://schemas.example.com/search/query/2010/5/revision"> 

    <FeedRequest locale="en-US" title="<some value>"/> 
</FeedEntity> 
... another FeedEntity element ... 
</Feed>    

Jednak, kiedy wydrukować dokument I utworzoną ElementTree lib, wygląda bardziej jak to:

<Feed> 
    <ns0:FeedEntity Id="0000" 
     xmlns:ns0="http://schemas.example.com/search/query/2010/5/revision"> 

     <FeedRequest locale="en-US" title="<some value>"/> 
    </ns0:FeedEntity> 
</Feed> 

Oto jak tworzę dokumentu:

counter = 0 
namespace = "http://schemas.example.com/search/query/2010/5/revision" 

root = Element("Feed")   

node_name = "{%s}FeedEntity" % (namespace,);     
feed_entity_element = Element(node_name)   

feed_entity_element["Id"] = "%04d" % (counter,); 

feed_request_element = Element("FeedRequest"); 
feed_request_element["Culture"] = self.culture; 
feed_request_element["Query"] = address;   

# append each of the elements to the xml document 
feed_entity_element.append(feed_request_element); 

root.append(feed_entity_element); 

str_data = ET.tostring(root) 
print str_data 

Jak pozbyć się części "ns0" w ostatecznym kodzie XML, aby wyglądał bardziej jak pierwszy przykład opisany powyżej?

+3

Dlaczego chcesz to zmienić - wszystko przy użyciu XML powinno traktować obie wersje tak samo. – Mark

Odpowiedz

4

Z xml.etree nie można uzyskać dokładnego wyniku, jak w pierwszym przykładzie, ale można użyć funkcji (globalnej) register_namespace(), aby użyć "lepszego" prefiksu niż "ns0". Na przykład: ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision') sprawi, że wynik będzie wyglądał jak rev:FeedEntity.

Biblioteka (zgodna) lxml jest bardziej elastyczna w odniesieniu do prefiksów przestrzeni nazw i allows you to provide a prefix mapping when creating an element.

+1

Okazuje się, że można również przypisać atrybutowi "xmlns" dla elementu i będzie on wytwarzał takie same ciągi znaków xml. –

Powiązane problemy