什么是XML?
- XML 指可扩展标记语言(eXtensible Markup Language)。
- XML 被设计用来传输和存储数据。
- XML 是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。
XML也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。
Python对XML的解析
Python 有三种方法解析 XML,SAX,DOM,以及 ElementTree:
- SAX (simple API for XML )。Python 标准库包含 SAX 解析器,SAX 用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
- DOM(Document Object Model)。将 XML 数据在内存中解析成一个树,通过对树的操作来操作XML。
- 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>