【问题标题】:Python pretty XML printer with lxml带有 lxml 的 Python 漂亮的 XML 打印机
【发布时间】:2011-07-02 11:55:10
【问题描述】:

在使用“丑陋”的 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)

【问题讨论】:

    标签: python lxml pretty-print


    【解决方案1】:

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

    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)
    

    这将“重置”已经存在的缩进,允许输出正确生成它自己的缩进。然后像往常一样漂亮打印:

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

    【讨论】:

      【解决方案2】:

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

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

      或者,如果您的输入源不够完美和/或您想要更多的旋钮和按钮来配置您的输出,您可以使用其中一个 python 包装器来构建整洁的库。

      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)
      

      【讨论】:

      【解决方案3】:
      fp = file('out.txt', 'w')
      print(e.tree.tostring(...), file=fp)
      fp.close()
      

      【讨论】:

      • 什么是e.tree?
      【解决方案4】:

      这是一个固定用于 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 代码。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2018-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-25
          • 1970-01-01
          • 1970-01-01
          • 2018-10-04
          相关资源
          最近更新 更多