1 解析
1.1 解析方式
Python 有三种 XML 解析方式:SAX(simple API for XML)、DOM(Document Object Model)、ElementTree。
DOM 方式:DOM 中文译为文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。
SAX 方式:SAX 是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析,对于大型文档的解析拥有巨大优势,尽管不是 W3C 标准,但它却得到了广泛认可。
ElementTree 方式:ElementTree 相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。
1.2 具体实现
在具体解析之前我们先准备一个 XML,如下所示:
test.xml
<?xml version="1.0" encoding="utf-8"?>
<list>
<student id="stu1" name="stu">
<id>1001</id>
<name>张三</name>
<age>22</age>
<gender>男</gender>
</student>
<student id="stu2" name="stu">
<id>1002</id>
<name>李四</name>
<age>21</age>
<gender>女</gender>
</student>
</list>
DOM 方式解析
使用 DOM 方式,首先要对其 API 有一定了解,如果不了解,网上的教程也比较多,比如:DOM 教程,下面看一下使用示例。
from xml.dom.minidom import parse
dom = parse('test.xml')
data = dom.documentElement
stus = data.getElementsByTagName('student')
for stu in stus:
st_id = stu.getAttribute('id')
st_name = stu.getAttribute('name')
id = stu.getElementsByTagName('id')[0].childNodes[0].nodeValue
name = stu.getElementsByTagName('name')[0].childNodes[0].nodeValue
age = stu.getElementsByTagName('age')[0].childNodes[0].nodeValue
gender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValue
print('st_id:', st_id, ', st_name:',st_name)
print('id:', id, ', name:', name, ', age:', age, ', gender:',gender)
SAX 方式解析
使用 SAX 解析 XML 文档主要涉及到解析器和事件处理器,解析器负责读取 XML 文档,并向事件处理器发送事件,事件处理器负责对事件作出响应,对传递的 XML 数据进行处理。
Python 使用 SAX 处理 XML 需要用到 xml.sax 中的 parse 函数和 xml.sax.handler 中的 ContentHandler 类,下面看一下 ContentHandler 类中的一些方法。
characters(content):调用时机:从行开始,遇到标签之前,存在字符,content 的值为这些字符串;从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串;从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
startDocument():文档启动的时候调用。
endDocument():解析器到达文档结尾时调用。
startElement(name, attrs):遇到 XML 开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。
endElement(name):遇到 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):
self.CurrentData = tag
if tag == "student":
stu_name = attributes["name"]
print("stu_name:", stu_name)
def endElement(self, tag):
if self.CurrentData == "id":
print("id:", self.id)
elif self.CurrentData == "name":
print("name:", self.name)
elif self.CurrentData == "age":
print("age:", self.age)
elif self.CurrentData == "gender":
print("gender:", self.gender)
self.CurrentData = ""
def characters(self, content):
if self.CurrentData == "id":
self.id = content
elif self.CurrentData == "name":
self.name = content
elif self.CurrentData == "age":
self.age = content
elif self.CurrentData == "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)
parser.parse("test.xml")
ElementTree 方式解析
Python 提供了两种 ElementTree 的实现方式。一个是纯 Python 实现的 xml.etree.ElementTree,另一个是 C 语言实现 xml.etree.cElementTree,使用 C 语言实现的方式速度更快且内存消耗更少。Python3.3 之后,ElemenTree 模块会自动优先使用 C 加速器,如果不存在 C 实现,则会使用 Python 实现。因此,使用 Python3.3+ 时,只需要 import xml.etree.ElementTree 即可。下面看一下示例。
import xml.etree.ElementTree as ET
tree = ET.parse("test.xml")
root = tree.getroot()
print('root_tag:',root.tag)
for stu in root:
print ("stu_name:", stu.attrib["name"])
print ("id:", stu[0].text)
print ("name:", stu[1].text)
print("age:", stu[2].text)
print("gender:", stu[3].text)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)