Как сохранить файл XML на диск с Python? - PullRequest
8 голосов
/ 28 марта 2012

У меня есть некоторый код на Python для генерации XML-текста с помощью xml.dom.minidom.Прямо сейчас я запускаю его из терминала, и в результате он выводит мне структурированный XML.Я хотел бы также создать файл XML и сохранить его на моем диске.Как это можно сделать?

Вот что у меня есть:

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="  ")

Это просто генерирует XML.Как я могу также сохранить его в виде файла на рабочем столе?

Ответы [ 2 ]

13 голосов
/ 28 марта 2012

Возможно, вы захотите использовать Node.writexml() в корневом узле дерева XML DOM. Это запишет ваш корневой элемент и все дочерние элементы в XML-файл, выполнив все необходимые отступы и т. Д.

См. Документацию для xml.dom.minidom:

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

Запись XML для объекта записи. Писатель должен иметь write() метод, который соответствует интерфейсу файлового объекта. indent Параметр является отступом текущего узла. addindent Параметр - это инкрементный отступ, используемый для подузлов текущий. Параметр newl указывает строку для использования прекратить переводы строки.

Для узла Document может использоваться дополнительная кодировка аргумента ключевого слова. используется для указания поля кодировки заголовка XML.

Изменено в версии 2.1: отступ необязательных параметров ключевых слов, addindent и newl были добавлены для поддержки симпатичного вывода.

Изменено в версии 2.3: для узла Документ добавлено дополнительное ключевое слово кодирование аргумента может использоваться для указания поля кодирования XML заголовок.

Использование будет примерно таким:

file_handle = open("filename.xml","wb")
Your_Root_Node.writexml(file_handle)
file_handle.close()
6 голосов
/ 28 марта 2012

Прочитайте про python files , если вы xml в качестве строки, вы можете просто записать ее в файл, например,

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

Чтобы получить строку xml из узлов minidom, вы можете использовать

xml = Node.toxml()

или вы можете напрямую записать объект, который поддерживает запись, например, файл

Node.writexml(f)
...