10.3-生成XML文件并用SAX解析XML文件

本文介绍了一种使用Python创建和解析XML文件的方法。通过自定义类`BuildNewXML`,可以方便地生成带有层级结构的XML文件。同时,利用`xml.sax`模块,实现了对XML文件的高效解析,提取关键信息。
import sys
class BuildNewXML():
    
    def __init__(self,filename=None):
        self.filename=filename
        self.__get_f=None
    def openfile(self):
        if self.filename==None:
            print("没有提供文件名!在建立实例时,请提供建立文件的名称!")
            return False
        try:
            self.__get_f=open(self.filename,'a',encoding='utf-8')
        except:
            print('打开%s文件有问题!'%(self.filename))
            return False
            
    def writeXML(self,n,element):
        try:
            if n==0 :  
                self.__get_f.write(element+'\n')
            else:
                self.__get_f.write(' '*n+element+'\n')
        except:
            print('往%s文件写%s出错!'%(self.filename,element))
            sys.exit() 
    def closeXML(self):
        if self.__get_f:
            self.__get_f.close()
#====================================
filename="storehouse.xml"
flag=False
content={1:[0,'<storehouse>'],
         2:[4,'<goods category="fish">'],
         3:[8,'<title>淡水鱼</title>'],
         4:[8,'<name>鲫鱼</name>'],
         5:[8,'<amount>18</amount>'],
         6:[8,'<price>8</price>'],
         7:[4,'</goods>'],
         8:[4,'<goods category="fruit">'],
         9:[8,'<title>温带水果</title>'],
         10:[8,'<name>猕猴桃</name> '],
         11:[8,'<amount>10</amount>'],
         12:[8,'<price>10</price>'],
         13:[4,'</goods>'],
         14:[0,'</storehouse>']
            }
build_xml=BuildNewXML(filename)
try:
    build_xml.openfile()
    for get_item in content.items():
        build_xml.writeXML(get_item[1][0],get_item[1][1] )
    flag=True
except:
    print('往文件内容出错,退出程序!')
    sys.exit()
finally:
    if flag:
        build_xml.closeXML()
        print('往%s写内容完成!'%(filename))

    

C:\Anaconda3\python.exe D:/AI/三酷猫源代码/10/build_XML.py
往storehouse.xml写内容完成!

Process finished with exit code 0

<storehouse>
    <goods category="fish">
        <title>淡水鱼</title>
        <name>鲫鱼</name>
        <amount>18</amount>
        <price>8</price>
    </goods>
    <goods category="fruit">
        <title>温带水果</title>
        <name>猕猴桃</name> 
        <amount>10</amount>
        <price>10</price>
    </goods>
</storehouse>


import xml.sax
import sys
get_record=[]
class GetStorehouse(xml.sax.ContentHandler):
    def __init__(self):
        self.CurrentData=""
        self.title=""
        self.name=""
        self.amount=""
        self.price=""
    def startElement(self,label,attributes):
        self.CurrentData=label
        if label=="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":
            self.title=content
        elif self.CurrentData=="name":
            self.name=content
        elif self.CurrentData=="amount":
            self.amount=content
        elif self.CurrentData=="price":
            self.price=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")
print(get_record)




C:\Anaconda3\python.exe D:/AI/三酷猫源代码/10/SAX_parse_XML.py
['淡水鱼', '鲫鱼', '18', '8', '    ', '温带水果', '猕猴桃', '10', '10', '    ', '\n']

Process finished with exit code 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值