Python之SAX解析XML

SAX 是一种基于事件驱动的API。
利用 SAX 解析 XML 文档牵涉到两个部分: 解析器事件处理器
解析器负责读取 XML 文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
而事件处理器则负责对事件作出响应,对传递的 XML 数据进行处理。

1、对大型文件进行处理;
2、只需要文件的部分内容,或者只需从文件中得到特定信息。
3、想建立自己的对象模型的时候。

在 Python 中使用 sax 方式处理 xml 要先引入 xml.sax 中的 parse 函数,还有 xml.sax.handler 中的 ContentHandler。
ContentHandler 类方法介绍

characters(content) 方法
调用时机:
从行开始,遇到标签之前,存在字符,content 的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
startDocument() 方法
文档启动的时候调用。
endDocument() 方法
解析器到达文档结尾时调用。
startElement(name, attrs) 方法
遇到XML开始标签时调用,name 是标签的名字,attrs 是标签的属性值字典。
endElement(name) 方法
遇到XML结束标签时调用。
make_parser 方法
以下方法创建一个新的解析器对象并返回。
xml.sax.make_parser( [parser_list] )
参数说明:

parser_list - 可选参数,解析器列表

parser 方法
以下方法创建一个 SAX 解析器并解析xml文档:
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
参数说明:

xmlfile - xml文件名
contenthandler - 必须是一个 ContentHandler 的对象
errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler 对象

parseString 方法
parseString 方法创建一个 XML 解析器并解析 xml 字符串:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
参数说明:

xmlstring - xml字符串
contenthandler - 必须是一个 ContentHandler 的对象
errorhandler - 如果指定该参数,errorhandler 必须是一个 SAX ErrorHandler对象

将XML文件解析成对象并输出

import xml.sax
import os
import time
obj = {}

#创建、写入文件
def nsfile(s):
    #判断文件夹是否存在,如果不存在则创建
    b = os.path.exists("C:\\Users\\Administrator\\Desktop\\自己资料总结\\python\logFile\\")
    if b:
        print("File Exist!")
    else:
        os.mkdir("C:\\Users\\Administrator\\Desktop\\自己资料总结\\python\logFile\\")
    #生成文件
    localTime = time.strftime("%Y%m%d%H%M%S",time.localtime())
    #print localtime
    filename = "C:\\Users\\Administrator\\Desktop\\自己资料总结\\python\logFile\\"+localTime+".txt"
    #a:以追加模式打开(必要时可以创建)
    f = open(filename,'a')
    #文件写入
    f.write(s)
    f.close()
    print("ALL Down")
    time.sleep(1)

class aaaHandler(xml.sax.ContentHandler):
	def __init__(self):
		self.CurrentData = ""
	#元素开始调用
	def startElement(self,tag,attributes):
		print(tag)
		print(self.CurrentData)
	#元素结束调用
	def endElement(self,tag):
		#tag:节点名称   self.CurrentData:节点值
		if self.CurrentData == tag:
			self.CurrentData = ''
		obj[tag.lower()] = self.CurrentData

	#读取字符时调用
	def characters(self,content):
		self.CurrentData = content

	#解析到文档结尾时调用
	def endDocument(self):
		nsfile(str(obj))
if (__name__ == "__main__"):
	#创建一个XMLReader
	parser = xml.sax.make_parser()
	#关闭命名空间
	parser.setFeature(xml.sax.handler.feature_namespaces,0)

	#重写ContextHandler
	Handler = aaaHandler()
	parser.setContentHandler(Handler)
	parser.parse("aaa.xml")

效果:
在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python中有许多用于解析XML文件的库,其中最常用的是内置的ElementTree模块。下面是一个基本的XML解析示例: 假设有一个名为“example.xml”的XML文件,其中包含以下内容: ```xml <?xml version="1.0" encoding="UTF-8"?> <root> <person> <name>John</name> <age>30</age> </person> <person> <name>Jane</name> <age>25</age> </person> </root> ``` 要解析此文件,请使用以下代码: ```python import xml.etree.ElementTree as ET # 加载XML文件 tree = ET.parse('example.xml') # 获取根元素 root = tree.getroot() # 遍历所有person元素 for person in root.findall('person'): # 获取名称和年龄子元素 name = person.find('name').text age = person.find('age').text # 打印结果 print('Name: {}, Age: {}'.format(name, age)) ``` 运行此代码将输出: ``` Name: John, Age: 30 Name: Jane, Age: 25 ``` 在这个示例中,我们使用ElementTree库加载XML文件并获取根元素。然后我们使用`findall()`方法查找所有名为“person”的元素,并使用`find()`方法获取每个元素的子元素。最后,我们打印每个人的名称和年龄。 ### 回答2: 在Python中,我们可以使用内置的xml库来解析xml文件。首先,我们需要导入xml.etree.ElementTree模块,并使用其中的ElementTree类。 有两种常用的解析方式:DOM(文档对象模型)和SAX(简单API for XML)。DOM方式将整个xml文件加载到内存中,并以树形结构存储,可以方便地对节点进行修改。而SAX方式则是一种流式解析,逐个读取xml文件的节点并触发相应的事件。 下面是使用DOM方式解析xml文件的示例代码: ``` import xml.etree.ElementTree as ET tree = ET.parse('example.xml') # 解析xml文件 root = tree.getroot() # 获取根节点 # 遍历根节点下的所有子节点 for child in root: print(child.tag, child.attrib) # 打印节点的标签和属性 for subchild in child: print(subchild.tag, subchild.text) # 打印子节点的标签和文本内容 ``` 上述代码中的'example.xml'是xml文件的路径,可以根据实际情况进行替换。通过parse函数解析xml文件,然后使用getroot方法获取根节点。接着可以使用遍历等操作对节点进行处理,例如打印节点的标签和属性信息。 如果使用SAX方式解析xml文件,可以使用xml.sax模块中的handler类。首先需要定义一个名为ContentHandler的类,并重写其startElement、endElement和characters等方法。然后使用xml.sax.parse函数将xml文件和ContentHandler实例作为参数进行解析。 这是一个使用SAX方式解析xml文件的示例代码: ``` import xml.sax class MyHandler(xml.sax.ContentHandler): def startElement(self, name, attrs): print(name, attrs) # 打印节点的标签和属性 def characters(self, content): print(content) # 打印节点的文本内容 def endElement(self, name): pass xml.sax.parse('example.xml', MyHandler()) # 解析xml文件 ``` 同样,'example.xml'是xml文件的路径,可以替换为实际的文件路径。在MyHandler类中,我们可以根据需要重写startElement、endElement和characters等方法来处理不同的节点。 无论是DOM方式还是SAX方式,我们都可以根据具体需求选择合适的解析方式来解析xml文件。 ### 回答3: 在Python中,我们可以使用内置的`xml`模块来解析XML文件。 首先,我们需要导入`xml.etree.ElementTree`模块,并使用`ElementTree.parse()`函数来打开和解析XML文件。这个函数会返回一个`ElementTree`对象,我们可以使用它来获取XML文档的根元素。 接下来,我们可以使用`Element`对象的一些方法来获取和处理XML文档中的元素。例如,使用`Element.findall()`方法可以查找指定标签名的所有元素,使用`Element.find()`方法可以查找第一个匹配指定标签名的元素,使用`Element.text`属性可以获取元素的文本内容。 此外,我们还可以使用XPath表达式来选择特定的元素。可以通过`ElementTree`对象的`ElementTree.xpath()`方法或`Element`对象的`Element.findall()`方法来执行XPath查询。 下面是一个简单的示例,演示了如何使用Python解析XML文件: ```python import xml.etree.ElementTree as ET # 打开XML文件并解析 tree = ET.parse('example.xml') root = tree.getroot() # 获取根元素的标签名和属性 print("根元素:", root.tag) print("根元素属性:", root.attrib) # 遍历子元素并获取它们的标签名和文本内容 for child in root: print("子元素:", child.tag, child.text) # 使用XPath表达式查找指定元素 elements = root.findall(".//book[author='John Smith']") for element in elements: print("查找结果:", element.tag, element.attrib) ``` 请注意,解析XML文件时需要注意文件路径是否正确。另外,XML文件应该格式正确,否则可能会导致解析错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值