使用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”部分,使其看起来更像上面提到的第一个示例?
答
随着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字符串输出。 –
你为什么要改变它 - 任何使用XML的应该将两个版本视为相同。 – Mark