XML 应用程序学习笔记

1. 什么是 XML?

XML 是一种可扩展标记语言,被广泛应用于数据交换、数据描述、配置文件等领域。XML 的本质是一种文本格式,它通过标签来描述数据的结构和内容。

1.1 XML 标签

XML 标签由尖括号包围,通常成对出现,分为开始标签和结束标签,例如:<tag></tag>。开始标签和结束标签中间的文本称为元素的内容。

1.2 XML 属性

XML 元素可以有任意数量的属性,属性以名称和值的形式出现在开始标签中,例如:<tag attr1="value1" attr2="value2"></tag>

1.3 XML 命名空间

XML 命名空间是一种机制,用于区分不同来源的 XML 元素和属性。命名空间可以将相同名称的元素、属性进行区分,从而避免命名冲突。

2. 如何解析 XML?

解析 XML 可以使用 DOM 或 SAX 解析器。

2.1 DOM 解析器

DOM 解析器将整个 XML 文档读入内存,形成一个树形结构,可以通过遍历树来访问 XML 元素和属性。DOM 解析器适合于小型文档,但对于大型文档则会占用较大的内存。

2.2 SAX 解析器

SAX 解析器以事件驱动的方式解析 XML 文档,遇到元素、属性时会触发相应的事件。SAX 解析器适合于大型文档,因为它不需要将整个文档读入内存中。

3. 实例

下面是一个简单的 XML 文档示例:

xmlCopy Code
<?xml version="1.0" encoding="UTF-8"?> <bookstore> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="children"> <title lang="en">Harry Potter</title> <author>J.K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>

该 XML 文档描述了一个书店中的两本书,其中每本书有标题、作者、年份和价格等信息。以下是解析该文档的示例代码:

3.1 DOM 解析器示例代码

pythonCopy Code
import xml.dom.minidom # 读取 XML 文件 dom = xml.dom.minidom.parse("books.xml") bookstore = dom.documentElement # 获取所有 book 元素 books = bookstore.getElementsByTagName("book") # 遍历 book 元素 for book in books: print("category:", book.getAttribute("category")) print("title:", book.getElementsByTagName("title")[0].childNodes[0].data) print("author:", book.getElementsByTagName("author")[0].childNodes[0].data) print("year:", book.getElementsByTagName("year")[0].childNodes[0].data) print("price:", book.getElementsByTagName("price")[0].childNodes[0].data)

3.2 SAX 解析器示例代码

pythonCopy Code
import xml.sax # 定义书籍类 class BookHandler(xml.sax.ContentHandler): def __init__(self): self.CurrentData = "" self.Category = "" self.Title = "" self.Author = "" self.Year = "" self.Price = "" # 元素开始事件 def startElement(self, tag, attributes): self.CurrentData = tag if tag == "book": print("*****Book*****") category = attributes["category"] print("Category:", category) # 元素结束事件 def endElement(self, tag): if self.CurrentData == "title": print("Title:", self.Title) elif self.CurrentData == "author": print("Author:", self.Author) elif self.CurrentData == "year": print("Year:", self.Year) elif self.CurrentData == "price": print("Price:", self.Price) self.CurrentData = "" # 内容事件 def characters(self, content): if self.CurrentData == "title": self.Title = content elif self.CurrentData == "author": self.Author = content elif self.CurrentData == "year": self.Year = content elif self.CurrentData == "price": self.Price = content # 创建 SAX 解析器并解析 XML 文件 parser = xml.sax.make_parser() parser.setContentHandler(BookHandler()) parser.parse("books.xml")