如何在Python中编写没有标题的XML文件?

时间:2010-05-29 00:28:42

标签: python xml

当使用Python的库存XML工具(例如xml.dom.minidom)进行XML编写时,文件总是会像

一样开始

<?xml version="1.0"?>

[...]

虽然这是完全合法的XML代码,甚至建议使用标题,但我想摆脱它,因为我正在使用的程序之一在这里有问题。

我似乎无法在xml.dom.minidom中找到合适的选项,所以我想知道是否有其他软件包允许忽略标题。

干杯,

尼科

8 个答案:

答案 0 :(得分:15)

不幸的是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 definesxml-declaration配置参数可用于抑制它。我所知道的唯一的Python实现是pxdom,它在标准支持方面是彻底的,但根本不是很快。

答案 1 :(得分:5)

如果你想使用minidom并保持'漂亮',那么这是一个快速/骇人的解决方案:

<强> 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

答案 2 :(得分:0)

纯粹主义者可能不喜欢听到这个,但我发现使用XML解析器来生成XML是过度的。只需将其直接生成为字符串。这也可以让您生成大于内存的文件,这是DOM无法做到的。阅读XML是另一回事。

答案 3 :(得分:0)

如果您已开始使用minidom,只需扫描文件并在编写所需的所有XML后删除第一行。

答案 4 :(得分:0)

您可以使用自定义文件类对象删除第一个标记,例如:

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文件非常大,则不必完全重写文件。

答案 5 :(得分:0)

标题在Document中打印。如果直接打印节点,则不会打印标题。

root = doc.childNodes[0]
root.toprettyxml(encoding="utf-8")

答案 6 :(得分:0)

只需将第一行替换为空白:

import xml.dom.minidom as MD     
<XML String>.replace(MD.Document().toxml()+'\n', '') 

答案 7 :(得分:0)

使用字符串替换

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()

就是这样;)