在将处理过的数据写入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;。
答案 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 />"