带有lxml的Python漂亮的XML打印机

时间:2011-02-23 04:14:18

标签: python lxml pretty-print

从具有“丑陋”XML的现有文件读取并进行一些修改后,漂亮的打印不起作用。我试过了etree.write(FILE_NAME, pretty_print=True)

我有以下XML:

<testsuites tests="14" failures="0" disabled="0" errors="0" time="0.306" name="AllTests">
    <testsuite name="AIR" tests="14" failures="0" disabled="0" errors="0" time="0.306">
....

我这样使用它:

tree = etree.parse('original.xml')
root = tree.getroot()

...    
# modifications
...

with open(FILE_NAME, "w") as f:
    tree.write(f, pretty_print=True)

5 个答案:

答案 0 :(得分:43)

对我来说,这个问题直到我注意到这个小小的问题才得以解决:

http://lxml.de/FAQ.html#why-doesn-t-the-pretty-print-option-reformat-my-xml-output

简短版本:

使用以下命令读入文件:

>>> parser = etree.XMLParser(remove_blank_text=True)
>>> tree = etree.parse(filename, parser)

那将&#34;重置&#34;已存在的缩进,允许输出正确生成它自己的缩进。那么pretty_print正常:

>>> tree.write(<output_file_name>, pretty_print=True)

答案 1 :(得分:9)

嗯,根据API docs,lxml etree模块中没有“write”方法。关于将漂亮的xml字符串打印到文件中,您有几个选项。您可以像这样使用tostring方法:

f = open('doc.xml', 'w')
f.write(etree.tostring(root, pretty_print=True))
f.close()

或者,如果你的输入源不够完美和/或你想要更多的旋钮和按钮来配置你的输出你可以使用一个python包装器来整理你的lib。

http://utidylib.berlios.de/

import tidy
f.write(tidy.parseString(your_xml_str, **{'output_xml':1, 'indent':1, 'input_xml':1}))

http://countergram.com/open-source/pytidylib

from tidylib import tidy_document
document, errors = tidy_document(your_xml_str, options={'output_xml':1, 'indent':1, 'input_xml':1})
f.write(document)

答案 2 :(得分:6)

fp = file('out.txt', 'w')
print(e.tree.tostring(...), file=fp)
fp.close()

答案 3 :(得分:2)

我不确定为什么其他答案没有提到这一点。如果要获取xml的根,则会有一个名为getroot()的方法。我希望我回答你的问题(虽然有点迟了)。

tree = et.parse(xmlFile)
root = tree.getroot()

答案 4 :(得分:0)

这是一个固定的答案,可用于Python 3:

from lxml import etree
from sys import stdout
from io import BytesIO

parser = etree.XMLParser(remove_blank_text = True)
file_obj = BytesIO(text)
tree = etree.parse(file_obj, parser)
tree.write(stdout.buffer, pretty_print = True)

其中text是作为字节序列的xml代码。