2012-03-28 27 views
5

Tengo un código python para generar texto XML con xml.dom.minidom. En este momento, lo ejecuto desde la terminal y me da como resultado un XML estructurado. Me gustaría también generar un archivo XML y guardarlo en mi disco. ¿Cómo podría hacerse eso?¿Cómo guardar un archivo XML en un disco con python?

Esto es lo que tengo:

import xml 
from xml.dom.minidom import Document 
import copy 


class dict2xml(object): 
    doc  = Document() 

    def __init__(self, structure): 
     if len(structure) == 1: 
      rootName = str(structure.keys()[0]) 
      self.root = self.doc.createElement(rootName) 

      self.doc.appendChild(self.root) 
      self.build(self.root, structure[rootName]) 

    def build(self, father, structure): 
     if type(structure) == dict: 
      for k in structure: 
       tag = self.doc.createElement(k) 
       father.appendChild(tag) 
       self.build(tag, structure[k]) 

     elif type(structure) == list: 
      grandFather = father.parentNode 
      tagName  = father.tagName 
      # grandFather.removeChild(father) 
      for l in structure: 
       tag = self.doc.createElement(tagName.rstrip('s')) 
       self.build(tag, l) 
       father.appendChild(tag) 

     else: 
      data = str(structure) 
      tag  = self.doc.createTextNode(data) 
      father.appendChild(tag) 

    def display(self): 
     print self.doc.toprettyxml(indent=" ") 

Esto sólo genera el XML. ¿Cómo podría también guardarlo como un archivo en mi escritorio?

Respuesta

10

Probablemente desee utilizar Node.writexml() en el nodo raíz del árbol DOM XML. Esto escribirá su elemento raíz y todos los elementos secundarios en un archivo XML, haciendo todas las sangrías necesarias, etc. en el camino.

See the documentation for xml.dom.minidom:

Node.writexml(writer[, indent=""[, addindent=""[, newl=""]]])

escritura XML para el objeto escritor. El escritor debe tener un método write() que coincida con el de la interfaz del objeto de archivo. El parámetro indent es la sangría del nodo actual. El parámetro addindent es la sangría incremental que se utiliza para los subnodos del actual. El parámetro newl especifica la cadena que se usará para finalizar nuevas líneas.

Para el nodo Documento, una codificación de argumento de palabra clave adicional puede ser utilizada para especificar el campo de codificación del encabezado XML.

Modificado en la versión 2.1: la sangría opcional de parámetros de palabra clave, addindent y newl se agregaron para admitir resultados bonitos.

Modificado en la versión 2.3: para el nodo Documento, se puede utilizar una codificación de argumento adicional de la palabra clave para especificar el campo de codificación del encabezado XML .

Uso será algo como:

file_handle = open("filename.xml","wb") 
Your_Root_Node.writexml(file_handle) 
file_handle.close() 
+0

Aún no puede hacerlo funcionar –

+1

¿Qué hizo exactamente? La pregunta editada solo incluye código para imprimir bastante el XML en la consola. No incluye el intento de utilizar 'writexml()', por lo que no podemos ayudarlo a solucionarlo. Muestre cómo intentó usar 'writexml()' y cómo no funcionó (¿hubo un mensaje de error? o ¿no funcionó como pretendía?) –

+0

Abrir en modo "wb" no funcionó para mí, sin embargo, solo "w" funcionó –

6

Lea acerca de python files, si escribe xml como una cadena, simplemente puede escribirla en un archivo, p.

xml = "<myxmldata/>" 
f = open("myxmlfile.xml", "wb") 
f.write(xml) 
f.close() 

Para obtener cadena XML desde los nodos minidom que puede utilizar

xml = Node.toxml() 

o puede escribir directamente a un objeto que soporta escribir, por ejemplo, un archivo

Node.writexml(f) 
+0

se ha perdido una marca de cita allí. ;) –

+0

@Lucas Pereira - "archivos" son solo la mitad de la historia. Necesita 1) crear y poblar un objeto SimplXML, luego 2) escribir el objeto en un archivo de texto. Li-aung Yip explica cómo. – paulsm4

+0

@ paulsm4 dijo que ya está generando la salida xml al terminal –