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.