Python XML解析

python对XML的解析

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

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

1.SAX (simple API for XML )

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的值为这些字符串。

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

startDocument()方法

文档启动的时候调用。

endDocument()方法

解析器到达文档结尾时调用。

startElement(name, attrs)方法

遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。

endElement(name)方法

遇到XML结束标签时调用。

Student.xml

<?xml version="1.0" encoding="utf-8" ?>
<Students shelf="金庸程序工程师">
    <Student id="01">
        <name>张三</name>
        <age>29</age>
        <sex>男</sex>
    </Student>
    <Student id="02">
        <name>李四</name>
        <age>20</age>
        <sex>女</sex>
    </Student>
    <Student id="03">
        <name>神雕</name>
        <age>299</age>
        <sex>公</sex>
    </Student>
</Students>
#sax解析
from xml.sax import ContentHandler
from xml.sax import parse

class Student:
    def __init__(self,name=None,age=None,sex=None):
        self.name=name
        self.age=age
        self.sex=sex
    def __str__(self):
        return self.name+','+str(self.age)+self.sex

students=[]
class saxdemo(ContentHandler):
    def startDocument(self):
        print("startDocument...")
        pass
    def endDocument(self):
        print("endDocument...")
        pass
    def startElement(self, name, attrs):
        print('startElement...')
        if name=='Student':
            self.student=Student()
    def endElement(self, name):
        print('endElement...')
        if name=='name':
            self.student.name=self.tag
        if name=='age':
            self.student.age=self.tag
        if name=='sex':
            self.student.sex=self.tag
        if name=='Student':
            students.append(self.student)
        pass
    def characters(self, content):
        print('characters... content:%s'%(content))
        self.tag=content
        pass

parse('Student.xml',saxdemo())

for stu in students:
    print(stu)

2.DOM(Document Object Model)

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

books.xml内容如下.

<?xml version="1.0" encoding="utf-8" ?>
<books shelf="金庸程序工程师">
    <book id="01">
        <bookname>python入门</bookname>
        <author>李强</author>
        <price>25</price>
    </book>
    <book id="02">
        <bookname>java基础</bookname>
        <author>王洋</author>
        <price>30</price>
    </book>
    <book id="03">
        <bookname>神雕侠侣</bookname>
        <author>金庸</author>
        <price>125</price>
    </book>
</books>
#dom解析
from xml.dom.minidom import parse
import xml.dom.minidom

#使用minidom解析器打开xml文件
DOMTree=xml.dom.minidom.parse('book.xml')
books=DOMTree.documentElement
if books.hasAttribute("shelf"):
    print("根节点 :%s"%(books.getAttribute("shelf")))
    #获取所有书籍节点
    bookEs=books.getElementsByTagName("book")
    #遍历每本书籍,打印详细信息
    for book in bookEs:
        if book.hasAttribute("id"):
            print('book节点 id值为%s'%(book.getAttribute("id")))
        bookname=book.getElementsByTagName("bookname")[0]
        print('book bookname:%s'%(bookname.childNodes[0].data))
        author = book.getElementsByTagName("author")[0]
        print('book author:%s' % (author.childNodes[0].data))
        price = book.getElementsByTagName("price")[0]
        print('book price:%s' % (price.childNodes[0].data))

3.ElementTree

对比其他 Python 处理 XML 的方案,xml.etree.ElementTree 模块(下文我们以 ET 来表示)相对来说比较简单,接口也较友好

ElementTree提供的方法

  • find(match)                                                    # 查找第一个匹配的子元素, match可以时tag或是xpaht路径
  • findall(match)                                              # 返回所有匹配的子元素列表
  • findtext(matchdefault=None)                     # 
  • iter(tag=None)                                              # 以当前元素为根节点 创建树迭代器,如果tag不为None,则以tag进行过滤
  • iterfind(match
  • parse(match)                                             #从指定的 XML 文件构造一个ElementTree对象
#etree解析
import xml.etree.ElementTree as et
root=et.parse('Student.xml')
stus=root.findall("Student")
p=[]
for stu in stus:
    student=Student()
    student.name=stu.find("name").text
    student.age=stu.find("age").text
    student.sex=stu.find("sex").text
    p.append(student)
for i in p:
    print(i)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值