Creating xml doc with python/ElementTree and namespaces
I'm trying to create an in-memory xml document such that 开发者_StackOverflow中文版the root's child nodes all require a name space.
The final document should look something like this:
<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>
However, when I print out the document I've created with ElementTree lib, it looks more like this:
<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>
Here's how I'm creating the document:
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
How do I get rid of the "ns0" parts in the final XML so it looks more like the first example noted above?
With xml.etree
, you cannot get the exact output as in the first example, but you can use the (global) register_namespace() function to use a "better" prefix than "ns0". For example: ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision')
will make sure the output will look like rev:FeedEntity
.
The (compatible) lxml library, however, is more flexible with regard to namespace prefixes, and allows you to provide a prefix mapping when creating an element.
精彩评论