有没有办法删除ElementTree.tostring方法添加的xml标头?

时间:2014-12-11 16:59:15

标签: python xml python-2.7 elementtree

在将处理过的数据写入xml之前,我会做一些格式化,所以在结果xml文档中看起来都很好。

import xml.etree.ElementTree as et
import xml.dom.minidom as mdom
(...)

for i in range(10):
    root = et.Element("main")
    (...)

    ugly_xml = et.tostring(root, 'utf-8', method='xml')
    parsed_xml = mdom.parseString(ugly_xml)
    nice_xml = parsed_xml.toprettyxml(indent=" " * 3)
    with open('test.xml', 'a') as f:
         f.write(nice_xml)

但是结果文件显然有重复的xml标题。

<?xml version="1.0" ?>
(...)
<?xml version="1.0" ?>
(...)
<?xml version="1.0" ?>

有没有办法不用tostring方法打印xml标头?文档没有提供任何信息,除了我可以尝试不同的类型,如&#39; html&#39;或者&#39;文字&#39;。

3 个答案:

答案 0 :(得分:1)

如果您只想了解它,ElementTree作者建议以下function将空白注入文档(添加示例):

from xml.etree import ElementTree as et

def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

m = et.Element(u'main')
s1 = et.SubElement(m,u'sub1')
s2 = et.SubElement(s1,u'sub2')
s2.text = u'马克'

print et.tostring(m,'utf-8')
indent(m)
print et.tostring(m,'utf-8')

输出:

<main><sub1><sub2>马克</sub2></sub1></main>
<main>
  <sub1>
    <sub2>马克</sub2>
  </sub1>
</main>

请注意,et.tostring本身并未添加标题。

答案 1 :(得分:1)

我想你需要&#39; utf8&#39;编码?如果是这样,试试:

"".join(ET.tostringlist(m, encoding='utf8', method='xml')[1:]))

但这可能依赖于tostringlist以非标准化方式表现......

答案 2 :(得分:0)

使用方法“ html”

方法是“ xml”,“ html”或“文本”(默认为“ xml”)。

et.tostring(root, encoding='utf8', method="html").decode()

>>> import xml.etree.ElementTree as et
>>> root = et.Element("main")
>>> et.tostring(root, encoding='utf8', method="html").decode()
'<main></main>'
>>> et.tostring(root, encoding='utf8').decode()
"<?xml version='1.0' encoding='utf8'?>\n<main />"