Creating an xml document using python / ElementTree and namespaces

I am trying to create an XML document in memory, so the root child nodes require a namespace.

The resulting 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 a document that I created using the ElementTree lib, it looks something 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> 

This is how I create a 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 that it looks more like the first example noted above?

+6
source share
1 answer

With xml.etree you cannot get the exact result, as in the first example, but you can use the global register_namespace () 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 that the result will look like rev:FeedEntity .

The (compatible) lxml library , however, is more flexible with regard to namespace prefixes and allows you to ensure that the prefix is ​​displayed when creating an element .

+4
source

Source: https://habr.com/ru/post/896668/


All Articles