Serializar el diccionario de Python a XML

XML es un lenguaje de marcado diseñado para transportar datos. Se hizo teniendo en cuenta su autodescripción. La sintaxis de XML es similar a HTML, excepto por el hecho de que las etiquetas en XML no están predefinidas. Esto permite que los datos se almacenen entre etiquetas personalizadas donde la etiqueta contiene detalles sobre los datos y los datos se almacenan entre las etiquetas de apertura y cierre.

Nota: Puede leer más sobre XML aquí: XML | Fundamentos y XML | Sintaxis

Actualmente, hay dos módulos principales que permiten serializar el diccionario Python a XML. Están 

  1. dict2xml
  2. dictadoxml

Usando dict2xml

Para una conversión rápida de Python Dictionary a XML, puede usar dict2xml. Instálalo usando:  

$ pip install dict2xml

Ahora suponga que tiene un diccionario llamado datos en Python que desea convertir a XML  

Python3

# Converting Python Dictionary to XML
from dict2xml import dict2xml
 
 
data = {'a': 2,
        'b': {
               'c': 'as',
               'f': True},
        'd': 7,
        }
 
xml = dict2xml(data)
print(xml)

Producción:

<a>2</a>
<b>
  <c>as</c>
  <f>True</f>
</b>
<d>7</d>

Envolviendo un elemento raíz y sangría personalizada 
Suponga que desea envolver la respuesta alrededor de un elemento raíz y agregar una sangría de 3 espacios. 

Python3

# Converting Python Dictionary to XML
# with a root elemtnt
from dict2xml import dict2xml
 
 
data = {'a': 2,
        'b': {
               'c': 'as',
               'f': True},
        'd': 7,
        }
 
xml = dict2xml(data, wrap ='root', indent ="   ")
print(xml)

Producción: 

<root>
   <a>2</a>
   <b>
      <c>as</c>
      <f>True</f>
   </b>
   <d>7</d>
</root>

dictadoxml

Dict2xml es bueno, pero no tiene muchas opciones para especificar cómo quiero que se formatee mi XML o para agregar atributos en las etiquetas. dicttoxml se puede utilizar para estos fines. También funciona perfectamente en objetos similares a Dict e iterables. Instálelo a través de la terminal o el símbolo del sistema escribiendo:  

 $ pip install dicttoxml 

o  

 $ easy_install dicttoxml  

Python3

# Using dicttoxml for converting Python
#  Dictionary to XML
from dicttoxml import dicttoxml
 
 
# Data to be parsed
data = {'a': 2,
        'b': {
               'c': 'as',
               'f': True},
        'd': 7,
        }
 
xml = dicttoxml(data)
print(xml)

Producción:

b'<?xml version=”1.0″ encoding=”UTF-8″ ?><root><a type=”int”>2</a><b type=”dict”><c type=”str” >como</c><f type=”bool”>Verdadero</f></b><d type=”int”>7</d></root>’

Formato bonito de la salida 
Vamos a dar formato bonito al texto para que podamos leerlo con claridad. ¡Python ya tiene un paquete incorporado para esto! 

Python3

# Pretty printing XML after parsing
# it from dictionary
from xml.dom.minidom import parseString
from dicttoxml import dicttoxml
 
 
# Data to be parsed
data = {'a': 2,
        'b': {
               'c': 'as',
               'f': True},
        'd': 7,
        }
 
xml = dicttoxml(data)
dom = parseString(xml)
 
print(dom.toprettyxml())

Producción: 

<?xml version="1.0" ?>
<root>
    <a type="int">2</a>
    <b type="dict">
        <c type="str">as</c>
        <f type="bool">True</f>
    </b>
    <d type="int">7</d>
</root>

Eliminación de atributos de tipo 
Puede notar que las etiquetas ahora contienen atributos como type=”int”/”dict”/”str” que se pueden desactivar usando attr_type=False 

Python3

# Removing Type Attribute from parsed XML
from xml.dom.minidom import parseString
 
# attr_type = False is used
# to remove type attributes
xml = dicttoxml(data, attr_type = False)
 
print(parseString(xml).toprettyxml())

Producción: 

<?xml version="1.0" ?>
<root>
    <a>2</a>
    <b>
        <c>as</c>
        <f>True</f>
    </b>
    <d>7</d>
</root>

Guardar XML en un archivo 
En ocasiones, es posible que necesite guardar XML en un archivo, lo que se puede hacer de la siguiente manera

Python3

# Converting Python Dictionary to
# XML and saving to a file
from dicttoxml import dicttoxml
from xml.dom.minidom import parseString
 
 
# Variable name of Dictionary is data
xml = dicttoxml(data)
 
# Obtain decode string by decode()
# function
xml_decode = xml.decode()
 
xmlfile = open("dict.xml", "w")
xmlfile.write(xml_decode)
xmlfile.close()

Producción:
 

python-serialize-dictionary-to-xml

Definir nombres de elementos personalizados 
Si no desea que los elementos de una lista se llamen ‘elemento’, puede especificar el nombre del elemento mediante una función que toma el nombre del elemento principal (es decir, el nombre de la lista) como argumento. 

Python3

# Defining custom names for lists
from dicttoxml import dicttoxml
from xml.dom.minidom import parseString
 
 
# Dictionary to be converted
obj = {'mylist': [u'foo', u'bar', u'baz'],
       'mydict': {
                  'foo': u'bar',
                  'baz': 1},
       'ok': True}
 
# custom function for defining
# item names
my_item_func = lambda x: 'list_item'
xml = dicttoxml(obj, item_func = my_item_func)
 
# Pretty formating XML
xml_format = parseString(xml).toprettyxml()
 
print(xml_format)

Producción: 

<?xml version="1.0" ?>
<root>
    <mylist type="list">
        <list_item type="str">foo</list_item>
        <list_item type="str">bar</list_item>
        <list_item type="str">baz</list_item>
    </mylist>
    <mydict type="dict">
        <foo type="str">bar</foo>
        <baz type="int">1</baz>
    </mydict>
    <ok type="bool">True</ok>
</root>

El beneficio de tomar el nombre del elemento principal como argumento es que puede escribir la función para hacer algo con él. Supongamos que tiene un objeto con algunas listas de elementos específicos: 

Python3

# Using parent name in dictionary
# as tag name in xml
 
from dicttoxml import dicttoxml
from xml.dom.minidom import parseString
 
# Dictionary to be converted
data = {
    'month':['Jan', 'Feb',
             'Mar', 'Apr',
             'May', 'Jun',
             'Jul', 'Aug',
             'Sep', 'Oct',
             'Nov', 'Dec']
       }
 
# Here x is the parent, you can chose
# to do some processing or use a part
# of the parent name for tag name
my_item_func = lambda x: x+'s'
xml = dicttoxml(data, item_func = my_item_func)
 
print(parseString(xml).toprettyxml())

Producción: 

<?xml version="1.0" ?>
<root>
    <month type="list">
        <months type="str">Jan</months>
        <months type="str">Feb</months>
        <months type="str">Mar</months>
        <months type="str">Apr</months>
        <months type="str">May</months>
        <months type="str">Jun</months>
        <months type="str">Jul</months>
        <months type="str">Aug</months>
        <months type="str">Sep</months>
        <months type="str">Oct</months>
        <months type="str">Nov</months>
        <months type="str">Dec</months>
    </month>
</root>

Publicación traducida automáticamente

Artículo escrito por Jai_dewani y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *