2012-02-05 4 views
6

Aquí está mi código:Python y XML: cómo colocar dos documentos en un solo documento

def extract_infos(i): 
    blabla... 
    blabla calculate v... 
    dom = xml.dom.minidom.parseString(v) 
    return dom 

doc = xml.dom.minidom.Document() 
for i in range(1,100): 
    dom = extract_infos(i) 
    for child in dom.childNodes: 
     doc.appendChild(child.cloneNode(True)) 

Las dos últimas líneas de trabajo una vez y luego:

Traceback (most recent call last): 
    File "./c.py", line 197, in <module> 
    doc.appendChild(child.cloneNode(True)) 
    File "/usr/lib/python2.6/xml/dom/minidom.py", line 1552, in appendChild 
    "two document elements disallowed") 
xml.dom.HierarchyRequestErr: two document elements disallowed 

Así que mi pregunta es: ¿Cómo coloque los dos documentos existentes en un documento nuevo (colocando los elementos raíz de cada uno en un nuevo elemento raíz global).

+0

Los DOM no funcionan de esa manera. –

+0

@Olivier, mi respuesta muestra cómo puedes agregar un DOM a otro de una manera bastante "limpia", pero supongo que querías algo más. No entiendo la solución que menciona en el comentario a la respuesta de Lattyware. ¿El resultado final es un documento XML bien formado, o qué es? – mzjn

+0

@Oliver Finalmente entiendo su pregunta, usted pidió agregar un dom al final de otro, pero lo que realmente quería era tomar dos documentos y ponerlos como parte de un nuevo documento, que es algo diferente. Lo primero no es posible mientras se produce XML, de ahí mi respuesta. Este último, por otro lado, es. –

Respuesta

8

Así es como los documentos XML se pueden anexar a un único elemento raíz maestro utilizando minidom.

from xml.dom import minidom, getDOMImplementation 

XML1 = """ 
<sub1> 
<foo>BAR1</foo> 
</sub1>""" 

XML2 = """ 
<sub2> 
<foo>BAR2</foo> 
</sub2>""" 

impl = getDOMImplementation() 
doc = impl.createDocument(None, "root", None) 

for s in [XML1, XML2]: 
    elem = minidom.parseString(s).firstChild 
    doc.firstChild.appendChild(elem) 

print doc.toxml() 

=>

<?xml version="1.0" ?><root><sub1> 
<foo>BAR1</foo> 
</sub1><sub2> 
<foo>BAR2</foo> 
</sub2></root> 

Desde añadiendo Document objetos no funciona, firstChild se utiliza para obtener el nivel superior Element.

+0

¡Esta es exactamente la respuesta que estaba esperando, 'muchas gracias'! –

2

la pregunta formulada cómo anexar documento XML uno al otro, lo que significa que dio la siguiente respuesta:

Un documento XML must have a single root node, así que esto no es posible, mientras que la producción de XML válido.

+0

Gracias por su respuesta, pero desafortunadamente no solo estaba preguntando "por qué", sino también "cómo" ... Todavía no sé cómo agregar un dom completo a otro. Supongo que hay algo que ver con 'child.cloneNode (True)' pero no sé cómo ... –

+0

@OlivierPons Lo que decía no era un por qué, era un 'Es imposible'. No se puede agregar un dom a otro ya que eso no produciría XML. Si realmente desea hacerlo, lea los contenidos del archivo y añádalos al final del otro archivo como una operación de texto. Esto hará lo que quieras, aunque el resultado será inútil ya que no será XML válido. –

+0

Eso es exactamente lo que hice: transformar a XML ('dom.toprettyxml (indent =" ")) .encode ('utf-8')') luego eliminar el encabezado '' y concatenar todo esto, luego Llamo a 'dom = xml.dom.minidom.parseString (v)'. Funciona perfectamente, pero desde mi punto de vista no es "limpio". De todos modos, funciona. Verifico su respuesta como válida, aunque podría responderme a mí mismo y dar la solución para ayudar a la comunidad =) –

Cuestiones relacionadas