python有3种方法解析XML:SAX,DOM以及ElemenTree
1、SAX(simple API for XML)
python标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发事件并调用用户定义的回调函数来处理XML文件
2、DOM(Document object Model)
xml.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)
3、elementTree解析
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)
SAX解析XML
# SAX是一种基于事件驱动的API
# 两个部分:解析器和事件处理器
# 解析器负责读取XML文档,并向事件处理器发送事件,如:元素开始跟元素结束事件
# 事件处理器:负责对事件作出响应,对传递的XML数据进行处理
# 对大型文件进行处理
# 只需要文件的部分内容,或者只需从文件中得到特定信息
# 想建立自己的对象模型的时候适合用
from xml.sax import parse from xml.sax import ContentHandler class Student: def __init__(self, id=None, name=None, age=None, sex=None): self.name = name self.age = age self.sex = sex self.id = id def __str__(self): return self.id + "-" + self.name + "-" + str(self.age) + "-" + self.sex
在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对象 '''