2011-09-05 13 views
6

Estoy intentando crear un documento xml en memoria de modo que los nodos secundarios de la raíz requieran un espacio de nombre.Creación de documento XML con Python/ElementTree y espacios de nombres

El documento final debe ser algo como esto:

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

Sin embargo, al imprimir el documento que he creado con elementtree lib, se parece más a esto:

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

Aquí es la forma en que estoy creando el documento:

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 

¿Cómo me deshago de las partes "ns0" en el XML final para que se parezca más al primer ejemplo mencionado anteriormente?

+3

¿Por qué quieres cambiarlo? Cualquier cosa que use XML debería tratar las dos versiones de la misma manera. – Mark

Respuesta

4

Con xml.etree, no puede obtener la salida exacta como en el primer ejemplo, pero puede usar la función (global) register_namespace() para usar un prefijo "mejor" que "ns0". Por ejemplo: ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision') se asegurará de que la salida se verá como rev:FeedEntity.

La biblioteca (compatible) lxml, sin embargo, es más flexible con respecto a los prefijos del espacio de nombres, y allows you to provide a prefix mapping when creating an element.

+1

Resulta que también puede asignar el atributo 'xmlns' para el elemento y producirá el mismo resultado de cadena xml. –

Cuestiones relacionadas