Removing python namespace attributes from lxml.objectify.ObjectifiedElement object

Possible duplicate:
When using lxml, is it possible to display XML without namespace attributes?

How can I separate python attributes from lxml.objectify.ObjectifiedElement ?

Example:

 In [1]: from lxml import etree, objectify In [2]: foo = objectify.Element("foo") In [3]: foo.bar = "hi" In [4]: foo.baz = 1 In [5]: foo.fritz = None In [6]: print etree.tostring(foo, pretty_print=True) <foo xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" py:pytype="TREE"> <bar py:pytype="str">hi</bar> <baz py:pytype="int">1</baz> <fritz xsi:nil="true"/> </foo> 

Instead, I would like the result to look like this:

 <foo> <bar>hi</bar> <baz>1</baz> <fritz/> </foo> 
+5
source share
2 answers

There is also a specialized function objectify.deannotate (...):

 Help on built-in function deannotate in module lxml.objectify: deannotate(...) deannotate(element_or_tree, pytype=True, xsi=True, xsi_nil=False, cleanup_namespaces=False) Recursively de-annotate the elements of an XML tree by removing 'py:pytype' and/or 'xsi:type' attributes and/or 'xsi:nil' attributes. If the 'pytype' keyword argument is True (the default), 'py:pytype' attributes will be removed. If the 'xsi' keyword argument is True (the default), 'xsi:type' attributes will be removed. If the 'xsi_nil' keyword argument is True (default: False), 'xsi:nil' attributes will be removed. Note that this does not touch the namespace declarations by default. If you want to remove unused namespace declarations from the tree, pass the option ``cleanup_namespaces=True``. 
+4
source

You can accomplish this using etree.strip_attributes and etree.cleanup_namespaces .

 In [8]: etree.strip_attributes(foo, '{http://codespeak.net/lxml/objectify/pytype}pytype') In [9]: print etree.tostring(foo, pretty_print=True) <foo xmlns:py="http://codespeak.net/lxml/objectify/pytype" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bar>hi</bar> <baz>1</baz> <fritz xsi:nil="true"/> </foo> In [10]: etree.cleanup_namespaces(foo) In [11]: print etree.tostring(foo, pretty_print=True) <foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <bar>hi</bar> <baz>1</baz> <fritz xsi:nil="true"/> </foo> 

This still leaves the xsi:nil link, which you can remove in the same way.

 In [12]: etree.strip_attributes(foo, '{http://www.w3.org/2001/XMLSchema-instance}nil') In [13]: etree.cleanup_namespaces(foo) In [14]: print etree.tostring(foo, pretty_print=True) <foo> <bar>hi</bar> <baz>1</baz> <fritz/> </foo> 
+11
source

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


All Articles