XML教程:从入门到精通

发布时间:2023-05-23

一. 什么是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服务中的传输和交换数据;
  • 配置文件的存储和读取;
  • 异构系统间的数据交换;
  • 语言中的富文本存储和传输。