2012-03-28 121 views
5

我有一些python代码,用xml.dom.minidom生成一些XML文本。现在,我从终端运行它,并为其输出结构化的XML。我希望它也能生成一个XML文件并将其保存到我的磁盘。这怎么可能完成?如何使用python将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。我怎么能把它作为文件保存到我的桌面?

回答

10

你可能想你的XML DOM树的根节点上使用Node.writexml()。这会将你的根元素和所有的子元素写入一个XML文件,一路做所有必要的缩进等。

See the documentation for xml.dom.minidom:

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

XML写入作家对象。作者应该有一个与文件对象接口相匹配的方法write()indent 参数是当前节点的缩进。 addindent 参数是用于当前节点的子节点的递增缩进。 newl参数指定用于终止换行符的字符串 。

对于文档节点,附加的关键字参数编码可以是 ,用于指定XML标头的编码字段。

在版本2.1中更改:添加了可选的关键字参数indent, addindent和newl以支持漂亮的输出。

版本2.3中已更改:对于文档节点,可以使用附加关键字 参数编码来指定XML 标头的编码字段。

用法会有点像:

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

仍然无法管理它工作 – 2012-03-29 20:19:09

+1

你究竟是什么试一下?你编辑的问题只包含了将XML打印到控制台的代码,它不包括你使用'writexml()'的尝试,所以我们无法帮你解决这个问题。请告诉我们你是如何尝试使用'writexml()'以及它如何失效(是否有错误信息?或者它没有按照你的意图工作?) – 2012-03-30 01:19:37

+0

在模式“wb”中打开没有为我工作,但只是“w”工作 – 2017-12-08 03:35:24

6

阅读关于python files,如果您将xml作为字符串,您可以将其写入文件,例如

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

要从minidom命名节点获得XML字符串既可以使用

xml = Node.toxml() 

,或者您可以直接写入到支持例如写对象文件

Node.writexml(f) 
+0

你错过了引号那里。 ;) – 2012-03-28 17:41:38

+0

@Lucas Pereira - “档案”只有这个故事的一半。您需要1)创建并填充SimplXML对象,然后2)将对象写入文本文件。 Li-aung Yip讨论如何。 – paulsm4 2012-03-28 17:43:41

+0

@ paulsm4他说他已经生成了xml输出到终端 – 2012-03-28 18:13:44