当使用Python的库存XML工具(例如xml.dom.minidom
)进行XML编写时,文件总是会像
<?xml version="1.0"?>
[...]
虽然这是完全合法的XML代码,甚至建议使用标题,但我想摆脱它,因为我正在使用的程序之一在这里有问题。
我似乎无法在xml.dom.minidom
中找到合适的选项,所以我想知道是否有其他软件包允许忽略标题。
干杯,
尼科
答案 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 defines和xml-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()
就是这样;)