栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Python

python生成xml文件时进行格式美化

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python生成xml文件时进行格式美化

python生成xml文件时进行格式美化

文章目录
  • python生成xml文件时进行格式美化
    • 遇到的问题
    • 解决办法

遇到的问题

在使用python的ElementTree生成xml文件时,xml属性会被重新排序,xml文件默认无缩进,影响xml文件的可读性。

解决办法

重定向xml序列化方法。

import xml.etree.ElementTree as ET

def _serialize_xml(write, elem, qnames, namespaces,
                   short_empty_elements, level=0, **kwargs):
    tag = elem.tag
    text = elem.text
    if tag is ET.Comment:
        write("t" * level + "n" % text)
    elif tag is ET.ProcessingInstruction:
        write("" % text)
    else:
        tag = qnames[tag]
        if tag is None:
            if text:
                write(ET._escape_cdata(text))
            for e in elem:
                _serialize_xml(write, e, qnames, None, short_empty_elements=short_empty_elements, level=level+1)
        else:
            write("t" * level + "<" + tag)
            items = list(elem.items())
            if items or namespaces:
                if namespaces:
                    for v, k in sorted(namespaces.items(), key=lambda x: x[1]):  # sort on prefix
                        if k:
                            k = ":" + k
                        write(" xmlns%s="%s"" % (k, ET._escape_attrib(v)))
                for k, v in items:
                    if isinstance(k, ET.QName):
                        k = k.text
                    if isinstance(v, ET.QName):
                        v = qnames[v.text]
                    else:
                        v = ET._escape_attrib(v)
                    write(" %s="%s"" % (qnames[k], v))
            if text or len(elem) or not short_empty_elements:
                write(">n")
                if text:
                    write(ET._escape_cdata(text))
                for e in elem:
                    _serialize_xml(write, e, qnames, None, short_empty_elements=short_empty_elements, level=level+1)
                write("t" * level + "n")
            else:
                write(" />n")
    if elem.tail:
        write(ET._escape_cdata(elem.tail))

# 重定向xml序列化方法, 以下重定向方法2选1
ET._serialize_xml = _serialize_xml
ET._serialize["xml"] = _serialize_xml

示例:

# 重定向xml序列化方法
ET._serialize_xml = _serialize_xml

def xml_test():
    root = ET.Element("Root", {"level":"0"})
    comment = ET.Comment("This is a test")
    root.append(comment)

    element = ET.Element("Element")
    element.attrib = {"name":"Element", "level":"1"}
    element.append(comment)
    subelement = ET.SubElement(element, "SubElement")
    subelement.attrib = {"name":"SubElement", "level":"2"}
    root.append(element)

    tree = ET.ElementTree(root)
    tree.write("test.xml", encoding="utf-8", xml_declaration=True)

if __name__ == "__main__":
    xml_test()

结果:



        
        
                
                
        

未作美化时:



转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1038770.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号