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
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:
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