xml模块的API接口(执行错误,待更)


1.SAX(Simple API for XML,XML的简单处理API)
通过解析XML的过程中触发的一个个事件并调用用户定义的回调函数来处理XML文件.当文件很大或内存有限制时,可以只读取需要部分内容.
2.DOM(Document Object Model,文档对象模型)
SAX是只读的,DOM允许更改XML文件.

用SAX解析XML文件

import xml.sax
import sys
get_record=[]               #全局列表变量,准备接收获取的XML内容
class GetStorehouse(xml.sax.ContentHandler):        #自定义获取仓库商品类(事件处理器)
    def __init__(self):
        self.CurrentData=""                         #自定义当前元素标签名属性
        self.title=""
        self.name=""
        self.amount=""
        self.price=""                               #自定义商品内容属性
    def startElement(self,lable,attributes):        #遇到元素标签时触发该函数
        self.CurrentData=lable                      #label为实例对象在解析时传递的标签名
        if lable=="goods":                          #二级子元素的开始标签名比较
            category=attributes["category"]         #获取元素中属性对应的值
            return category                         #获取元素中属性对应的值
    def endElement(self,label):
        global get_record                           #声明全局变量
        if self.CurrentData=="title":
            get_record.append(self.title)
        elif self.CurrentData=="name":
            get_record.append(self.name)
        elif self.CurrentData == "amount":
            get_record.append(self.amount)
        elif self.CurrentData == "price":
            get_record.append(self.price)
    def characters(self,content):                   #遇到元素里的内容吧值赋给类实例属性
        if self.CurrentData=="title":               #如果遇到的元素标签是title
            self.title=content                      #把读取的内容赋给title
        elif self.CurrentData=="name":
            self.title=content
        elif self.CurrentData=="amount":
            self.title=content
        elif self.CurrentData=="price":
            self.title=content
#================================================
parser=xml.sax.make_parser()                    #创建一个解析器的XMLReader对象
parser.setFeature(xml.sax.handler.feature_namespaces,0)        #从XML文件解析数据 关闭#从命名空间解析
Handler=GetStorehouse()                         #建立事件处理器实例
parser.setContentHandler(Handler)               #为解析器设置事件处理器实例
parser.parse("storehouse.xml")                  #正式解析指定XML文件内容
print(get_record)                               #打印全局列表变量的获取结果