Python_解析xml

python对XML的解析

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

python有三种方法解析XML,SAX,DOM,以及ElementTree:

1.SAX (simple API for XML )

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

2.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

本章节使用到的XML实例文件movies.x

有一xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<newis>
	<newi>
		<name>zhangsan</name>
		<age>19</age>
		<sex>男</sex>
	</newi>
	<newi>
		<name>lisi</name>
		<age>22</age>
		<sex>男</sex>
	</newi>
	<newi>
		<name>wangwu</name>
		<age>18</age>
		<sex>女</sex>
	</newi>
</newis>

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

python中用xml.dom.minidom来解析xml文件  列如:

from xml.dom.minidom import parse
#加载xml文件
domTree = parse("newis.xml")
print(domTree)
root = domTree.documentElement
print(root)
#xml中的子节点
ps = root.getElementsByTagName("newi")
#domTree.getElementsByTagName()
#循环打印xml的内容
for p in ps:
    print(p.getElementsByTagName("name")[0].childNodes[0].data)
    print(p.getElementsByTagName("age")[0].childNodes[0].data)
    print(p.getElementsByTagName("sex")[0].childNodes[0].data)
结果如下:

<xml.dom.minidom.Document object at 0x000001A70F1FE588>
<DOM Element: newis at 0x1a70ef9ecc0>
zhangsan
19
男
lisi
22
男
wangwu
18
女

python使用SAX解析xml

SAX是一种基于事件驱动的API。

利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

1、对大型文件进行处理;

  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
  • 3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

ContentHandler类方法介绍

characters(content)方法

调用时机:

从行开始,遇到标签之前,存在字符,content的值为这些字符串。

从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。

从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。

标签可以是开始标签,也可以是结束标签。 列如:

from xml.sax import parse as par
import xml.sax
from xml.sax import ContentHandler
class newi:
    def __init__(self,name=None,age=None,sex=None):
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return "{0}\t{1}\t{2}".format(self.name,self.age,self.sex)
newis =[]
class myh(ContentHandler):
    def __init__(self):
        self.newi = None
        self.tag = None
    # 读取元素内容时调用(content:文本内容)
    def characters(self, content):
        if self.tag == "name":
            self.newi.name =content
        if self.tag == "age":
            self.newi.age = content
        if self.tag == "sex":
            self.newi.sex = content

    # 元素结束调用(name:元素名称)
    def startElement(self, name, attrs):
        self.tag = name
        if name == "newi":
            self.newi = newi()

    # 元素开始调用(name:元素名称,attrs:元素属性)
    def endElement(self, name):
        if name == 'newi':
            global newis  # 引用外部的全局变量
            newis.append(self.newi)
            self.newi = None
        self.tag = None

# 创建一个 XMLReader
parser = xml.sax.make_parser()

# 关闭命名空间(不验证命名空间)
parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写 ContextHandler
parser.setContentHandler(myh())

# 解析xml文档
parser.parse("newis.xml")
for y in newis:
    print(y)
结果如下:

zhangsan	19	男
lisi	22	男
wangwu	18	女








 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值