Python中xml解析

XML指可扩展标记语言(extensibleMarkup Language),被设计用来传输和存储数据

python有3种方法解析XML:SAX,DOM以及ElemenTree

1、SAX(simple API for XML)

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

2、DOM(Document object Model)

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

3、elementTree解析

 

一、SAX解析XML

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

# 两个部分:解析器和事件处理器

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

# 事件处理器:负责对事件作出响应,对传递的XML数据进行处理

# 对大型文件进行处理

# 只需要文件的部分内容,或者只需从文件中得到特定信息

# 想建立自己的对象模型的时候适合用

 

在python中使用sax方式处理xml:

先引入xml.sax中的parse函数、xml.sax.handler中的ContentHandler

1、  ContentHandler类方法

2、characters(content)方法

调用时机:从行开始,遇到标签之前,存在字符,content的值为这些字符串

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

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

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

3、startDocument()方法

文档启动的时候调用

4、endDocument()方法:解析器到达文档结尾时调用

5、startElement(name,attrs)方法:

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

6、endElement(name)方法:遇到XML结束标签时调用

7、make_parser方法:创建一个新的解析器对象并返回xml.sax.make_parser([parser_list])。parser_list————可选参数————解析器列表

8、parser方法:创建SAX解析器并解析xml文档,

   xml.sax.parse(xmlfile,contenthandler[,errorhandler])

       xmlfile - xml文件名

       contenthandler - 必须是一个ContentHandler的对象

        errorhandler - 如果指定该参数,errorhandler必须是一个SAXErrorHandler对象 '''

9、parseString方法:创建一个XML解析器并解析xml字符串

   xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

       xmlstring - xml字符串

       contenthandler - 必须是一个ContentHandler的对象

       errorhandler - 如果指定该参数,errorhandler必须是一个SAXErrorHandler对象

from xml.sax import parse, ContentHandler #引入继承包ContentHandler
class Book:
   
#定义初始化属性,和xml文件属性相同
    def __init__(self,bookname=None,author=None,price=None):
       
self.bookname=bookname
 
      self.author=author
       
self.price=price
   
def __str__(self):  #转换为字符串输出
       
return self.bookname+","+self.author+","+self.price
books=[]
#定义数组,用来存放每次得到的数据
#定义继承ContentHandler的类,可以实现相应的方法
class bkdemo(ContentHandler):
   
def __init__(self):
       
#定义全局变量
       
self.book=None #接收book的相应数据
        self.tag=None #接收characters方法得到的content内容
    def startDocument(self): #
       
print("对象开始")
   
def endDocument(self):  #
       
print("对象结束")
   
def startElement(self, name, attrs):#
       
if name=='book'#
           
self.book=Book()   
    def endElement(self, name): 
       
if name=='bookname':
           
self.book.bookname=self.tag  #对象的标签名=得到相应content的值
        if name=='author':
           
self.book.author=self.tag
       
if name=='price':
           
self.book.price=self.tag
       
if name=='book':
           
books.append(self.book) 

   
def characters(self, content):
       
self.tag=content   #写了self的,就可以定义为全局变量

parse("books.xml",bkdemo())  #parse的方法,分别指明xml文件,并调用查找的类方法
for i in books: 
   
print(i)

二、xml.dom解析xml

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

# DOM 解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,

# 之后利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。

 

from xml.dom.minidom import parse
import xml.dom.minidom

 # 使用minidom解析器打开 XML 文档
#引入parse的包
from xml.dom.minidom import parse

doc=parse("books.xml")                   #先把xml文件加载进来
root=doc.documentElement                #获取元素的根节点
books=root.getElementsByTagName('book') #找到子节点,得到的是一个数组

for book in books:                       #把所有的子节点进行遍历
    print("===book====")
    if book.hasAttribute('id'):             #如果有ID属性,则输出
        print('书的ID是:%s'% book.getAttribute('id'))

    bookname=book.getElementsByTagName("bookname")[0#根据标签名找到,并且输出第一个元素
    print("书名是:%s"%bookname.childNodes[0].data)      #输出标签名的子节点的第一个值,并转为data类型
    author=book.getElementsByTagName("author")[0]
    print("作者是:%s"%author.childNodes[0].data)
    price=book.getElementsByTagName("price")[0]
    print("价格是:%s"%price.childNodes[0].data)


# 使用minidom解析器打开 XML 文档
DOMTree = xml.dom.minidom.parse("books.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
    print ("Root element : %s" % collection.getAttribute("shelf"))

#在集合中获取所有book
books = collection.getElementsByTagName("book")
#打印每本书的详细信息
for book in books:
    print('**************book****************')
    if book.hasAttribute("id"):
        print("id:%s"%book.getAttribute("id"))

    bookname = book.getElementsByTagName("bookname")[0]
    print("bookname:%s"%bookname.childNodes[0].data)
    author = book.getElementsByTagName('author')[0]
    print("author:%s"%author.childNodes[0].data)
    price = book.getElementsByTagName("price")[0]
    print("price:%s"%price.childNodes[0].data)

 

三、elementTree解析xml


from xml.etree import ElementTree  #引入ElementTree的包
#书的类
class Book:
    #定义初始化属性,和xml文件属性相同
    def __init__(self,bookname=None,author=None,price=None):
        self.bookname=bookname
        self.author=author
        self.price=price
    def __str__(self):  #转化为字符串输出
        return self.bookname+","+self.author+","+self.price

roota=ElementTree.parse("books.xml") #parse方法读取xml文件,得到元素树
bk=roota.findall("book"#findall查询所有的book标签
boo=[]   #定义一个集合
for aa in bk:   #对得到的所有的根元素下的子标签循环输出
    book=Book()   #定义一个类对象
    book.bookname=aa.find("bookname").text #对象的相应标签值=子标签查找到的固定标签名,并以text形式输出
    book.author=aa.find("author").text
    book.price=aa.find("price").text
    boo.append(book)  #将得到的属性值追加到定义的集合中

for i in boo:  #遍历集合
    print(i)

 

你可能感兴趣的:(笔记)