在Python的XML解析生态中,xml.sax模块基于事件驱动模式工作,不需要一次性将整个XML文件加载到内存,适合处理大体积XML数据。ContentHandler是xml.sax模块中用于处理XML解析事件的核心基类,当解析器遇到XML的开始标签、结束标签、文本内容时,会自动调用ContentHandler对应的回调方法,其中startElement方法就是专门处理开始标签的回调。

startElement方法的参数说明
ContentHandler的startElement方法有两个固定参数,重写时需要严格遵循参数定义:
- name:字符串类型,表示当前解析到的XML开始标签的名称,比如解析到<user>标签时,name的值就是user
- attrs:xml.sax.xmlreader.AttributesImpl类型,是标签的属性集合,可以通过类似字典的方式获取属性值
基础重写示例:提取标签名和属性
下面通过一个简单的XML示例,演示如何重写startElement方法获取标签基本信息:
待解析的XML内容如下:
<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1001" name="张三" age="25" />
<user id="1002" name="李四" age="28" />
</users>
对应的解析代码如下:
import xml.sax
class UserHandler(xml.sax.ContentHandler):
# 重写startElement方法
def startElement(self, name, attrs):
# 只处理user标签
if name == "user":
print(f"解析到user标签,属性如下:")
# 遍历属性集合
for attr_name in attrs.getNames():
print(f"{attr_name}: {attrs.getValue(attr_name)}")
# 创建解析器
parser = xml.sax.make_parser()
# 关闭命名空间处理
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 设置自定义处理器
handler = UserHandler()
parser.setContentHandler(handler)
# 解析XML字符串,也可以替换为parse方法解析本地文件
xml_content = """<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1001" name="张三" age="25" />
<user id="1002" name="李四" age="28" />
</users>"""
import io
parser.parse(io.StringIO(xml_content))
运行上述代码会输出每个user标签的id、name、age属性值,说明我们成功通过重写的startElement方法获取了标签信息。
进阶场景:处理嵌套标签的属性
如果XML存在嵌套结构,比如user标签内部还有address子标签,我们可以在startElement中通过记录当前标签层级的方式处理不同层级的标签:
import xml.sax
class NestedHandler(xml.sax.ContentHandler):
def __init__(self):
self.current_tag = None
def startElement(self, name, attrs):
self.current_tag = name
if name == "user":
print(f"=== 用户ID:{attrs.getValue('id')} ===")
elif name == "address":
print(f"地址标签属性:city={attrs.getValue('city')}")
def endElement(self, name):
# 标签结束时清空当前标签记录
if name == self.current_tag:
self.current_tag = None
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
handler = NestedHandler()
parser.setContentHandler(handler)
xml_content = """<?xml version="1.0" encoding="utf-8"?>
<users>
<user id="1001">
<address city="北京" street="中关村大街" />
</user>
</users>"""
import io
parser.parse(io.StringIO(xml_content))
注意事项
- 重写startElement时不能修改方法的参数数量和名称,否则解析器调用时会抛出异常
- attrs参数只有在标签有属性时才不为空,获取属性前可以先判断属性是否存在,避免KeyError
- 如果需要同时处理标签文本内容,可以配合重写characters方法,在startElement和endElement之间记录文本内容
xml.sax解析是流式处理,内存占用低,但无法像DOM解析那样随机访问XML节点,适合只需要顺序读取XML内容的场景。
Pythonxml_saxContentHandlerstartElementXML解析修改时间:2026-07-13 17:36:25