代码之家  ›  专栏  ›  技术社区  ›  MK.

在python中通过xml.etree.elementtree生成的xml文件中插入换行符

  •  29
  • MK.  · 技术社区  · 14 年前

    我在python中使用xml.etree.elementtree创建了一个XML文件。然后我用

    tree.write(filename, "UTF-8") 
    

    把文件写出来。

    但是当我使用文本编辑器(Linux上的vi)打开文件名时,标记之间没有换行符。一切都是一条大线

    我如何才能以“漂亮的打印”格式写出文档,以便在所有XML标记之间都有新行(希望还有缩进等)?

    谢谢!

    4 回复  |  直到 14 年前
        1
  •  19
  •   Alex L    11 年前

    我认为最简单的解决方案是切换到 lxml 图书馆。在大多数情况下,您可以更改您的进口 import xml.etree.ElementTree as etree from lxml import etree 或类似的。

    然后您可以使用 pretty_print 序列化时的选项:

    tree.write(filename, pretty_print=True)
    

    (也可在 etree.tostring )

        2
  •  44
  •   Erick M. Sprengel    9 年前

    我找到了一种避免新库和重新分析XML的新方法。 您只需要将根元素传递给这个函数(见下面的解释):

    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
    

    有一个名为“的属性 tail “在xml.etree.elementtree.element实例上。 此属性可以在节点后设置字符串:

    "<a>text</a>tail"
    

    我发现了一个2004年的链接 Element Library Functions 它使用这个“tail”来缩进一个元素。

    例子:

    root = ET.fromstring("<fruits><fruit>banana</fruit><fruit>apple</fruit></fruits>""")
    tree = ET.ElementTree(root)
    
    indent(root)
    # writing xml
    tree.write("example.xml", encoding="utf-8", xml_declaration=True)
    

    “example.xml”的结果:

    <?xml version='1.0' encoding='utf-8'?>
    <fruits>
        <fruit>banana</fruit>
        <fruit>apple</fruit>
    </fruits>
    
        3
  •  12
  •   gimel    14 年前

    在elementtree中没有很好的打印支持,但是您可以使用其他XML模块。

    例如, xml.dom.minidom.Node.toprettyxml() :

    Node.toprettyxml([indent=""[, newl=""[, encoding=""]]])

    返回文档的精美打印版本。indent指定缩进字符串并默认为制表符;newl指定每行末尾发出的字符串,默认为\n。

    使用 indent newl 以满足您的要求。

    使用默认格式字符的示例:

    >>> from xml.dom import minidom
    >>> from xml.etree import ElementTree
    >>> tree1=ElementTree.XML('<tips><tip>1</tip><tip>2</tip></tips>')
    >>> ElementTree.tostring(tree1)
    '<tips><tip>1</tip><tip>2</tip></tips>'
    >>> print minidom.parseString(ElementTree.tostring(tree1)).toprettyxml()
    <?xml version="1.0" ?>
    <tips>
        <tip>
            1
        </tip>
        <tip>
            2
        </tip>
    </tips>
    
    >>> 
    
        4
  •  0
  •   ChristopheD    14 年前

    According to this thread 您的最佳选择是安装 pyXml 并用它来 prettyprint 这个 ElementTree XML内容(因为在python中,elementtree在默认情况下似乎没有预打印器):

    import xml.etree.ElementTree as ET
    
    from xml.dom.ext.reader import Sax2
    from xml.dom.ext import PrettyPrint
    from StringIO import StringIO
    
    def prettyPrintET(etNode):
        reader = Sax2.Reader()
        docNode = reader.fromString(ET.tostring(etNode))
        tmpStream = StringIO()
        PrettyPrint(docNode, stream=tmpStream)
        return tmpStream.getvalue()