【问题标题】:Python/XML: Pretty-printing ElementTreePython/XML:漂亮的打印元素树
【发布时间】:2018-10-04 01:13:46
【问题描述】:

我使用The ElementTree XML API 构造 XML,我希望能够漂亮地打印

  • 单个节点(用于检查)以及
  • 整个文档(到一个文件中,以备将来检查)。

我可以使用 ET.write() 将我的 XML 写入文件,然后使用 Pretty printing XML in Python 中的许多建议进行漂亮打印。但是,这需要我序列化然后反序列化 XML(到磁盘或到 StringIO)只是为了再次漂亮地序列化它 - 这显然不是最佳的。

那么,有没有办法漂亮地打印xml.etree.ElementTree

【问题讨论】:

    标签: python xml python-2.7 pretty-print


    【解决方案1】:

    正如the docs 所说,在write 方法中:

    file 是文件名,或为写入而打开的文件对象。

    这包括一个StringIO 对象。所以:

    outfile = cStringIO.StringIO()
    tree.write(of)
    

    然后您可以使用您最喜欢的方法漂亮地打印outfile - 只需outfile.seek(0) 然后将outfile 本身传递给接收文件的函数,或者将outfile.getvalue() 传递给接收字符串的函数。


    但是,请注意,在您链接的问题中,许多漂亮地打印 XML 的方法甚至不需要这个。例如:

    【讨论】:

    • StringIO 正在序列化和反序列化 - nfg。
    • @sds 更改您的问题以使现有答案无关紧要确实没有帮助。
    • 道歉 - 但是,您必须同意 pp 的序列化和反序列化是 nfg ;-)
    • 更重要的是,您的新问题毫无意义。如果您想使用一个接受序列化 XML 文档的函数,显然您必须对其进行序列化。或者,您可以使用一个采用 ET 树的函数——在您链接的问题和这个答案中都有这样的例子。
    • @sds 我不知道“nfg”是什么意思,但是如果漂亮打印 XML 的成本是可以接受的,我认为序列化 XML 的成本是可以接受的,因为漂亮打印本质上意味着序列化.
    【解决方案2】:

    我在使用漂亮打印时遇到了问题。深入研究它,我发现了以下对我有用的解决方案。

    import xml.etree.cElementTree as etree
    from xml.dom import minidom
    
    root = etree.Element("root")
    animal = etree.SubElement(root, "animal")
    etree.SubElement(animal, "pet").text = "dog"
    
    xmlstr = 
    minidom.parseString(etree.toString(root)).toprettyxml(indent = "   ")
    print (xmlstr)
    

    以 XML 格式返回结果

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关 why 和/或 如何 此代码回答问题的附加上下文可提高其长期价值.
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多