使用python/ElementTree和名称空间创建xml文档

问题描述:

我试图创建一个内存中的xml文档,以便根的子节点都需要名称空间。使用python/ElementTree和名称空间创建xml文档

最后的文件应该是这个样子:

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

然而,当我打印出来,我跟ElementTree的lib中创建的文档,它看起来更像是这样的:

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

这里的我是如何创建的文档:

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 

如何摆脱最终XML中的“ns0”部分,使其看起来更像上面提到的第一个示例?

+3

你为什么要改变它 - 任何使用XML的应该将两个版本视为相同。 – Mark

随着xml.etree,你不能得到确切的输出作为第一个例子,但可以使用(全球)register_namespace()功能使用一个“好”字头比“NS0”。例如:ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision')将确保输出看起来像rev:FeedEntity

但是,(兼容)lxml库在命名空间前缀方面更为灵活,而allows you to provide a prefix mapping when creating an element也更灵活。

+1

原来,你也可以为元素分配属性'xmlns',它将产生相同的xml字符串输出。 –