2011-05-26 17 views
5

Duplicar posibles:
When using lxml, can the XML be rendered without namespace attributes?Decapado espacio de nombres pitón atributos de un lxml.objectify.ObjectifiedElement

¿Cómo puedo quitar los atributos de un pitón lxml.objectify.ObjectifiedElement?

Ejemplo:

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> 

Me lugar como la salida para que parezca:

<foo> 
    <bar>hi</bar> 
    <baz>1</baz> 
    <fritz/> 
</foo> 

Respuesta

4

También existe la función objectify.deannotate especializada (...):

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``. 
11

Usted puede lograr esto mediante el uso de etree.strip_attributes y 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> 

Esto aún deja la referencia xsi:nil, que se puede despojar de manera similar.

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> 
Cuestiones relacionadas