xml list标准格式_Python3生成XML文件

dbfa58c06043d7156b235e311b2942ea.png

什么是XML?

  • XML 指可扩展标记语言(eXtensible Markup Language)。
  • XML 被设计用来传输和存储数据。
  • XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

XML也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

Python对XML的解析

Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:

  1. SAX (simple API for XML )。Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
  2. DOM(Document Object Model)。将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。
  3. ElementTree(元素树)。ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

开始构建 XML 树

本篇文章使用ELmentTree创建XML文件,这里不涉及其他两种方法的使用。

#!/usr/bin/python3
# -*- coding:utf-8 -*-

#from xml.etree import ElementTree as  etree
from xml.etree.ElementTree import Element
from xml.etree.ElementTree import SubElement
from xml.etree.ElementTree import ElementTree

from xml.dom import minidom

# generate root node
root = Element('root')

# generate first child-node head
head = SubElement(root, 'head')

# child-node of head node
title = SubElement(head, 'title')
title.text = "Well Dola!"

# generate second child-node body
body = SubElement(root, 'body')
body.text = "I Love Dola!"

tree = ElementTree(root)

# write out xml data
tree.write('result.xml', encoding = 'utf-8')

生成的XML文件如下:

<root><head><title>Well Dola!</title></head><body>I Love Dola!</body></root>

可以看到ElementTree输出的xml文件没有换行,没有缩进,十分难以阅读。

接下来我们可以美化生成的XML文件:

#!/usr/bin/python3
# -*- coding:utf-8 -*-

# elemnt为传进来的Elment类,参数indent用于缩进,newline用于换行   
def prettyXml(element, indent, newline, level = 0): 
    # 判断element是否有子元素
    if element:
        # 如果element的text没有内容      
        if element.text == None or element.text.isspace():     
            element.text = newline + indent * (level + 1)      
        else:    
            element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * (level + 1)    
    # 此处两行如果把注释去掉,Element的text也会另起一行 
    #else:     
        #element.text = newline + indent * (level + 1) + element.text.strip() + newline + indent * level    
    temp = list(element) # 将elemnt转成list    
    for subelement in temp:    
        # 如果不是list的最后一个元素,说明下一个行是同级别元素的起始,缩进应一致
        if temp.index(subelement) < (len(temp) - 1):     
            subelement.tail = newline + indent * (level + 1)    
        else:  # 如果是list的最后一个元素, 说明下一行是母元素的结束,缩进应该少一个    
            subelement.tail = newline + indent * level   
        # 对子元素进行递归操作 
        prettyXml(subelement, indent, newline, level = level + 1)     
            
from xml.etree import ElementTree      #导入ElementTree模块    
tree = ElementTree.parse('result.xml')   #解析test.xml这个文件,该文件内容如上文    
root = tree.getroot()                  #得到根元素,Element类    
prettyXml(root, 't', 'n')            #执行美化方法    

#ElementTree.dump(root)                 #显示出美化后的XML内容  

tree.write('result.xml', encoding = 'utf-8')

美化后的XML文件就像下面这个样子:

<root>
	<head>
		<title>Well Dola!</title>
	</head>
	<body>I Love Dola!</body>
</root>

结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值