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



    
        张三
        29
        
    
    
        李四
        20
        
    
    
        神雕
        299
        
    
#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内容如下.



    
        python入门
        李强
        25
    
    
        java基础
        王洋
        30
    
    
        神雕侠侣
        金庸
        125
    
#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)


你可能感兴趣的:(Note)