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 Codeimport 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 Codeimport 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")