python通过 xml.etree.ElementTree 生成多层级xml文件

通过Element这个类来创建根节点,SubElement添加子节点

from xml.etree import ElementTree as ET
# 创建根节点(xml的第一个节点,根据需要,填写自己的)
root = ET.Element('根节点')
# 创建ElementTree
tree = ET.ElementTree(root)

#添加一级子节点
fst_son = ET.SubElement(root, '儿子层一')
fst_son.text = 'fisrt son'
sec_son = ET.SubElement(root, '儿子层二')
sec_son.text = 'second son'

#添加二级子节点
fst_grandson = ET.SubElement(fst_son, '孙子层一')
fst_grandson.text = 'fisrt grandson'
sec_grandson = ET.SubElement(sec_son, '孙子层二')
sec_grandson.text = 'second grandson'

#将这个xml树写进test.xml
tree.write('test.xml', encoding='utf-8', xml_declaration=True, short_empty_elements=True)

输出结果test.xml:

<?xml version='1.0' encoding='utf-8' standalone='no'?>
<根节点><儿子层一 描述="fisrt son"><孙子层一>fisrt grandson</孙子层一></儿子层一><儿子层二 描述="second son"><孙子层二>second grandson</孙子层二></儿子层二></根节点>

遇到的问题

        直接用notepad打开,会显示成上面这种格式,用浏览器打开则格式正确

解决办法

ElementTree 生成的xml格式就是一行字符,转换成我们需要的格式需要进行一下美化


'''
对生成的xml文件进行遍历、换行和缩进
'''
def pretty_xml(element, indent, newline, level=0):  # elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行
    if element:  # 判断element是否有子元素
        if (element.text is None) or element.text.isspace():  # 如果element的text没有内容
            element.text = newline + indent * (level + 1)
        else:
            element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)
            # else:  # 此处两行如果把注释去掉,Element的text也会另起一行
            # element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level
    temp = list(element)  # 将element转成list
    for subelement in temp:
        if temp.index(subelement) < (len(temp) - 1):  # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
            subelement.tail = newline + indent * (level + 1)
        else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个
            subelement.tail = newline + indent * level
        pretty_xml(subelement, indent, newline, level=level + 1)  # 对子元素进行递归操作

完整代码

from xml.etree import ElementTree as ET
'''
对生成的xml文件进行遍历、换行和缩进
'''
def pretty_xml(element, indent, newline, level=0):  # elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行
    if element:  # 判断element是否有子元素
        if (element.text is None) or element.text.isspace():  # 如果element的text没有内容
            element.text = newline + indent * (level + 1)
        else:
            element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)
            # else:  # 此处两行如果把注释去掉,Element的text也会另起一行
            # element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level
    temp = list(element)  # 将element转成list
    for subelement in temp:
        if temp.index(subelement) < (len(temp) - 1):  # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
            subelement.tail = newline + indent * (level + 1)
        else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个
            subelement.tail = newline + indent * level
        pretty_xml(subelement, indent, newline, level=level + 1)  # 对子元素进行递归操作



# 创建根节点(xml的第一个节点,根据需要,填写自己的)
root = ET.Element('根节点')
# 创建ElementTree
tree = ET.ElementTree(root)

#添加一级子节点
fst_son = ET.SubElement(root, '儿子层一',{'描述':'fisrt son'})
# fst_son.text = 'fisrt son'
sec_son = ET.SubElement(root, '儿子层二', {'描述':'second son'})
# sec_son.text = 'second son'

#添加二级子节点
fst_grandson = ET.SubElement(fst_son, '孙子层一')
fst_grandson.text = 'fisrt grandson'
sec_grandson = ET.SubElement(sec_son, '孙子层二')
sec_grandson.text = 'second grandson'

#将这个xml树先美化,再写进test.xml
# root = tree.getroot()  # 得到根元素,Element类
pretty_xml(root, '  ', '\n')  # 执行美化方法    缩进为两个空格,'\n'换行
tree.write('test.xml', encoding='utf-8', xml_declaration=True, short_empty_elements=True)

最终结果

<?xml version='1.0' encoding='utf-8' standalone='no'?>
<根节点>
  <儿子层一 描述="fisrt son">
    <孙子层一>fisrt grandson</孙子层一>
  </儿子层一>
  <儿子层二 描述="second son">
    <孙子层二>second grandson</孙子层二>
  </儿子层二>
</根节点>

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值