python xml 解析_python解析XML

具体实现

test.xml

<?xml version="1.0" encoding="utf-8"?>

1001

张三

22

1002

李四

21

DOM 方式解析

使用 DOM 方式,首先要对其 API 有一定了解,如果不了解,网上的教程也比较多,比如:DOM 教程,下面看一下使用示例。

from xml.dom.minidom import parse

# 读取文件

dom = parse('test.xml')

# 获取文档元素对象

data = dom.documentElement

# 获取 student

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)

结果:

st_id: stu1 , st_name: stu

id: 1001 , name: 张三 , age: 22 , gender: 男

st_id: stu2 , st_name: stu

id: 1002 , name: 李四 , age: 21 , 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__"):

# 创建 XMLReader

parser = xml.sax.make_parser()

# 关闭命名空间

parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写 ContextHandler

Handler = StudentHandler()

parser.setContentHandler(Handler)

parser.parse("test.xml")

输出结果:

stu_name: stu

id: 1001

name: 张三

age: 22

gender: 男

stu_name: stu

id: 1002

name: 李四

age: 21

gender: 女

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)

输出结果:

root_tag: list

stu_name: stu

id: 1001

name: 张三

age: 22

gender: 男

stu_name: stu

id: 1002

name: 李四

age: 21

gender: 女

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值