一. 什么是XML
XML,即可扩展标记语言(eXtensible Markup Language),是一种可以用于描述、存储和传输数据的标准格式。相较于HTML,XML更加灵活,可以自定义标记,非常适合用于不同系统间的数据交互和数据存储。下面我们来看下一个简单的XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="001">
<name>Tom</name>
<age>18</age>
<gender>male</gender>
</student>
<student id="002">
<name>Lucy</name>
<age>20</age>
<gender>female</gender>
</student>
</students>
在上述示例中,<?xml version="1.0" encoding="UTF-8"?>
表示该文档是一个XML文档,且版本为1.0,采用UTF-8编码。<students>
和</students>
用于表示该文档的根元素,其中包含了两个子元素<student>
,它们都包含了三个子元素<name>
、<age>
、<gender>
,同时还有一个id属性。
二. XML文档结构
XML文档有以下几个关键部分:
- XML声明:
<?xml version="1.0" encoding="UTF-8"?>
- DTD:文档类型定义,定义了文档的元素、属性、顺序等规则;
- 根元素:文档的最外层元素,其他所有元素都是其子元素、孙子元素等;
- 注释:
<!--这是一条注释-->
; - 其他元素:可以包含属性、文本、子元素等。
三. 常用XML元素
XML定义了很多元素用于描述数据,下面我们列举几个常用的元素:
<element>
:用于定义元素,可以设置属性和子元素;<attribute>
:用于定义元素的属性;<data>
:用于存储数据;<comment>
:用于添加注释。
四. XML解析
XML文档在不同系统间的传输和存储需要进行解析,常用的解析方式有DOM解析和SAX解析。
1. DOM解析
DOM解析会将整个XML文档解析为一个树形结构,将所有元素都存储在内存中,适合逐个访问和处理每个元素的场景。下面是使用Python的minidom模块解析XML文档的示例:
import xml.dom.minidom
# 打开XML文档
doc = xml.dom.minidom.parse("students.xml")
# 获取根元素
root = doc.documentElement
# 获取所有student元素
students = root.getElementsByTagName("student")
for student in students:
# 获取id属性和name元素的值
print("id:", student.getAttribute("id"), "name:", student.getElementsByTagName("name")[0].childNodes[0].data)
2. SAX解析
SAX解析是一种基于事件驱动的解析方式,适合处理大型文件和性能要求高的场景。它通过解析器逐行读取文档,遇到元素、属性、文本等事件都会触发相应的回调函数。下面是使用Python的xml.sax模块解析XML文档的示例:
import xml.sax
class StudentHandler(xml.sax.ContentHandler):
def __init__(self):
self.id = ""
self.name = ""
self.age = ""
self.gender = ""
# 元素开始事件
def startElement(self, tag, attributes):
if tag == "student":
self.id = attributes["id"]
# 元素结束事件
def endElement(self, tag):
if tag == "name":
print("id:", self.id, "name:", self.name)
elif tag == "age":
print("id:", self.id, "age:", self.age)
elif tag == "gender":
print("id:", self.id, "gender:", self.gender)
# 字符串事件
def characters(self, content):
if self.id != "":
if content.isspace():
return
elif self.name == "":
self.name = content
elif self.age == "":
self.age = content
elif self.gender == "":
self.gender = content
if __name__ == "__main__":
# 创建解析器
parser = xml.sax.make_parser()
# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 设置回调
handler = StudentHandler()
parser.setContentHandler(handler)
# 解析XML文档
parser.parse("students.xml")
五. XML的应用
下面列举几个XML的应用场景:
- Web服务中的传输和交换数据;
- 配置文件的存储和读取;
- 异构系统间的数据交换;
- 语言中的富文本存储和传输。