[英]How to write an XML file without header in Python?
当使用 Python 的xml.dom.minidom
XML 工具(例如xml.dom.minidom
进行 XML 编写)时,文件总是像这样开始
<?xml version="1.0"?>
[...]
虽然这是完全合法的 XML 代码,甚至建议使用标头,但我想摆脱它,因为我正在使用的程序之一在这里有问题。
我似乎无法在xml.dom.minidom
找到合适的选项,所以我想知道是否还有其他包允许忽略标题。
干杯,
妮可
不幸的是minidom
没有给你省略 XML 声明的选项。
但是,你可以随时调用自己连载的文档内容toxml()
文件的根元素,而不是在document
。 然后你不会得到一个 XML 声明:
xml= document.documentElement.toxml('utf-8')
...但是你也不会得到根元素之外的任何东西,比如 DOCTYPE,或者任何注释或处理指令。 如果需要,将文档对象的每个子项一一序列化:
xml= '\n'.join(node.toxml('utf-8') for node in document.childNodes)
我想知道是否还有其他软件包可以忽略标题。
DOM Level 3 LS 定义了一个xml-declaration
配置参数,您可以使用它来抑制它。 我所知道的唯一 Python 实现是pxdom
,它在标准支持方面非常全面,但速度并不快。
如果您想使用 minidom 并保持“漂亮”,那么将其作为快速/hacky 修复如何:
xml_without_declaration.py :
import xml.dom.minidom as xml
doc = xml.Document()
declaration = doc.toxml()
a = doc.createElement("A")
doc.appendChild(a)
b = doc.createElement("B")
a.appendChild(b)
xml = doc.toprettyxml()[len(declaration):]
print xml
标题打印在Document
。 如果直接打印节点,则不会打印标题。
root = doc.childNodes[0]
root.toprettyxml(encoding="utf-8")
只需将第一行替换为空白:
import xml.dom.minidom as MD
<XML String>.replace(MD.Document().toxml()+'\n', '')
纯粹主义者可能不喜欢听到这个,但我发现使用 XML 解析器生成 XML 有点过头了。 只需直接将其生成为字符串即可。 这也使您可以生成比内存中可以保存的文件更大的文件,而使用 DOM 则无法做到这一点。 阅读 XML 是另一回事。
如果您准备使用 minidom,只需扫描回文件并在编写您需要的所有 XML 后删除第一行。
您也许可以使用一个自定义的类文件对象来删除第一个标签,例如:
class RemoveFirstLine:
def __init__(self, f):
self.f = f
self.xmlTagFound = False
def __getattr__(self, attr):
return getattr(self, self.f)
def write(self, s):
if not self.xmlTagFound:
x = 0 # just to be safe
for x, c in enumerate(s):
if c == '>':
self.xmlTagFound = True
break
self.f.write(s[x+1:])
else:
self.f.write(s)
...
f = RemoveFirstLine(open('path', 'wb'))
Node.writexml(f, encoding='UTF-8')
或类似的东西。 这样做的好处是,如果 XML 文件相当大,则不必完全重写文件。
使用字符串替换
from xml.dom import minidom
mydoc = minidom.parse('filename.xml')
with open(newfile, "w" ) as fs:
fs.write(mydoc.toxml().replace('?xml version="1.0" ?>', ''))
fs.close()
就是这样 ;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.