python使用 xml.sax解析xml

本文介绍如何利用Python解析XML文档,通过SAX处理方式,展示XML中的关键数据,包括用户名称和描述信息。


Python代码  收藏代码
  1. #coding=utf-8  
  2. #XML处理  
  3. #SAX处理XML的方式和Java中的SAX解析器一样,从ContentHandler方法中继承,并处理startDocument、endDocument等信息  
  4. from xml.sax import *  
  5. #必须从xml.sax包中导入所有方法和变量  
  6. class UserDecodeHandler(ContentHandler):  
  7. #与Java的SAXParser基本一致,处理方法一样  
  8.     users=None  
  9.     map=None  
  10.     temp=""  
  11.     currenttag=None  
  12.     user=None  
  13.     #注意Python的特殊格式,必须有self作为第一个参数  
  14.     def startDocument(self):  
  15.         print "start xml document"  
  16.           
  17.     def endDocument(self):  
  18.         print "end xml document"  
  19.     #name=当前处理的标签名,attrs以dict的格式存放标签的所有属性  
  20.     def startElement(self,name,attrs):  
  21.         if name=="users":  
  22.             self.users=[]  
  23.         elif name=="user":  
  24.             self.user={"name":attrs['name']}  
  25.         self.currenttag=name  
  26.       
  27.     def endElement(self,name):  
  28.         if name=="user":  
  29.             self.users.append(self.user)  
  30.         elif name=="description":  
  31.             self.user.update({"description":self.temp.strip()})  
  32.             self.temp=""  
  33.         self.currenttag=None  
  34.     #content表示正在处理中的数据    
  35.     def characters(self,content):  
  36.         self.temp+=content  
  37.           
  38. #调用make_parser方法创建一个SAX解析器  
  39. # '''  
  40. print "===============SAX方式解析XML文档==================="  
  41. parser=make_parser()  
  42. handler=UserDecodeHandler()  
  43. parser.setContentHandler(handler)  
  44. data=""  
  45. with open("xmldata.xml") as file:  
  46.     data=file.read().strip()  
  47. import StringIO  
  48. #StringIO模块用于将字符串转换成流数据,类似于Java的ByteArrayOutputStream和ByteArrayInputStream  
  49. parser.parse(StringIO.StringIO(data))  
  50.   
  51. for item in handler.users:  
  52.     print "======================="  
  53.     for i in item.items():  
  54.         key,value=i  
  55.         print key,value.encode("gbk")  
  56. #'''  

 处理的xml内容如下,Python对XML的格式要求不那么严格,不要求必须有xml的DTD说明

 

Xml代码  收藏代码
  1. <users>  
  2.     <user name="zhang">  
  3.         <description>测试  
  4.         数据  
  5.         </description>  
  6.     </user>  
  7.     <user name="wang">  
  8.         <description>测试数据</description>  
  9.     </user>  
  10. </users> 

### Pythonxml.sax 模块使用指南 `xml.sax` 是 Python 中用于解析 XML 文件的模块之一,它采用事件驱动的方式解析 XML 数据。与 DOM 解析器不同,SAX(Simple API for XML)是一种基于事件的解析方法,适用于需要高效处理大型 XML 文件的场景。 以下是一个详细的使用指南和示例代码: #### 1. SAX 解析器的基本原理 SAX 解析器通过事件驱动模型工作。当解析器遇到特定的 XML 元素时,会触发相应的事件回调函数。这些事件包括但不限于开始文档、结束文档、开始标签、结束标签和字符数据等[^1]。 #### 2. 使用 `xml.sax` 的基本步骤 - 创建一个继承自 `xml.sax.ContentHandler` 的类,并重写其方法以定义如何处理不同的 XML 事件。 - 使用 `xml.sax.make_parser()` 创建一个解析器实例。 - 将自定义的 `ContentHandler` 设置为解析器的内容处理器。 - 调用解析器的 `parse()` 方法来解析目标 XML 文件或字符串。 #### 3. 示例代码 以下是一个完整的示例,展示如何使用 `xml.sax` 模块解析 XML 文件: ```python import xml.sax # 定义 ContentHandler 子类 class MyContentHandler(xml.sax.ContentHandler): def startDocument(self): print("Start Document") def endDocument(self): print("End Document") def startElement(self, name, attrs): print(f"Start Element: {name}") for attr_name in attrs.getNames(): print(f"Attribute: {attr_name} = {attrs[attr_name]}") def endElement(self, name): print(f"End Element: {name}") def characters(self, content): if content.strip(): # 忽略空白字符 print(f"Characters: {content}") # 创建解析器并解析 XML 文件 if __name__ == "__main__": parser = xml.sax.make_parser() # 创建解析器 handler = MyContentHandler() # 创建内容处理器 parser.setContentHandler(handler) # 设置内容处理器 parser.parse("example.xml") # 解析 XML 文件 ``` #### 4. 示例 XML 文件 假设有一个名为 `example.xml` 的文件,内容如下: ```xml <bookstore> <book category="fiction"> <title lang="en">Harry Potter</title> <author>J.K. Rowling</author> <year>2005</year> </book> <book category="non-fiction"> <title lang="en">Learning Python</title> <author>Mark Lutz</author> <year>2013</year> </book> </bookstore> ``` 运行上述代码后,将输出每个元素的开始和结束事件,以及属性和字符数据。 #### 5. 注意事项 - SAX 解析器是单向的,无法回退或重新读取已解析的部分。 - 对于简单的 XML 数据操作,推荐使用 `xml.etree.ElementTree` 或 `lxml` 等更易用的模块。 - 如果需要处理大规模 XML 文件,SAX 解析器由于其低内存占用特性成为首选[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值