library example etree dict create python xml elementtree

example - python xml to dict



EmisiĆ³n de especificaciones de espacio de nombres con ElementTree en Python (2)

Estoy intentando emitir un archivo XML con un árbol de elementos que contiene una declaración XML y espacios de nombres. Aquí está mi código de muestra:

from xml.etree import ElementTree as ET ET.register_namespace(''com'',"http://www.company.com") #some name # build a tree structure root = ET.Element("STUFF") body = ET.SubElement(root, "MORE_STUFF") body.text = "STUFF EVERYWHERE!" # wrap it in an ElementTree instance, and save as XML tree = ET.ElementTree(root) tree.write("page.xml", xml_declaration=True, method="xml" )

Sin embargo, no sale la etiqueta <?xml ni ninguna información de prefijo o espacio de nombres. Estoy más que un poco confundido aquí.


Aunque los docs dicen lo contrario, solo pude obtener una declaración <?xml> especificando tanto la xml_declaration como la codificación.

Debe declarar los nodos en el espacio de nombres que ha registrado para obtener el espacio de nombres en los nodos del archivo. Aquí hay una versión fija de su código:

from xml.etree import ElementTree as ET ET.register_namespace(''com'',"http://www.company.com") #some name # build a tree structure root = ET.Element("{http://www.company.com}STUFF") body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF") body.text = "STUFF EVERYWHERE!" # wrap it in an ElementTree instance, and save as XML tree = ET.ElementTree(root) tree.write("page.xml", xml_declaration=True,encoding=''utf-8'', method="xml")

Salida (page.xml)

<?xml version=''1.0'' encoding=''utf-8''?><com:STUFF xmlns:com="http://www.company.com"><com:MORE_STUFF>STUFF EVERYWHERE!</com:MORE_STUFF></com:STUFF>

ElementTree tampoco imprime bastante. Aquí está la salida bastante impresa:

<?xml version=''1.0'' encoding=''utf-8''?> <com:STUFF xmlns:com="http://www.company.com"> <com:MORE_STUFF>STUFF EVERYWHERE!</com:MORE_STUFF> </com:STUFF>

También puede declarar un espacio de nombre predeterminado y no necesita registrar uno:

from xml.etree import ElementTree as ET # build a tree structure root = ET.Element("{http://www.company.com}STUFF") body = ET.SubElement(root, "{http://www.company.com}MORE_STUFF") body.text = "STUFF EVERYWHERE!" # wrap it in an ElementTree instance, and save as XML tree = ET.ElementTree(root) tree.write("page.xml", xml_declaration=True,encoding=''utf-8'', method="xml",default_namespace=''http://www.company.com'')

Salida (el espaciado de impresión bonita es mío)

<?xml version=''1.0'' encoding=''utf-8''?> <STUFF xmlns="http://www.company.com"> <MORE_STUFF>STUFF EVERYWHERE!</MORE_STUFF> </STUFF>


Nunca he podido obtener la etiqueta <?xml de las bibliotecas del árbol de elementos programáticamente, así que sugiero que intentes algo como esto.

from xml.etree import ElementTree as ET root = ET.Element("STUFF") root.set(''com'',''http://www.company.com'') body = ET.SubElement(root, "MORE_STUFF") body.text = "STUFF EVERYWHERE!" f = open(''page.xml'', ''w'') f.write(''<?xml version="1.0" encoding="UTF-8"?>'' + ET.tostring(root)) f.close()

Las implementaciones de ElementTree no estándar de python lib pueden tener diferentes formas de especificar espacios de nombres, por lo que si decide pasar a lxml, la forma en que declare eso será diferente.