I’m trying to create an in-memory xml document such that 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 likerev: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.