在实际开发中,XML常作为数据交换格式出现。要从XML里提取特定数据,最稳妥的做法是使用专门的解析库,而不是用正则去匹配文本。下面以Python为例,介绍几种常见提取方式。

使用ElementTree解析XML
Python内置的xml.etree.ElementTree可以把XML字符串或文件加载为树结构,之后通过标签名、路径或XPath来获取节点。
示例XML内容
<?xml version="1.0" encoding="utf-8"?>
<root>
<user id="1">
<name>张三</name>
<age>28</age>
</user>
<user id="2">
<name>李四</name>
<age>35</age>
</user>
</root>
通过标签遍历提取
如果只想拿到所有用户的姓名,可以直接遍历user节点:
import xml.etree.ElementTree as ET
xml_text = '''<root>
<user id="1"><name>张三</name><age>28</age></user>
<user id="2"><name>李四</name><age>35</age></user>
</root>'''
root = ET.fromstring(xml_text)
for user in root.findall('user'):
name = user.find('name').text
age = user.find('age').text
print(name, age)
使用XPath提取特定数据
当结构变复杂时,用XPath更方便。ElementTree支持有限的XPath语法,比如按属性筛选。
import xml.etree.ElementTree as ET
xml_text = '''<root>
<user id="1"><name>张三</name><age>28</age></user>
<user id="2"><name>李四</name><age>35</age></user>
</root>'''
root = ET.fromstring(xml_text)
# 提取id为2的用户姓名
target = root.find("user[@id='2']/name")
print(target.text)
处理带命名空间的XML
很多标准XML会带命名空间,提取时要把命名空间写成带前缀的标签或传namespaces参数。
import xml.etree.ElementTree as ET
xml_text = '''<root xmlns:ns="http://ipipp.com/ns">
<ns:user><ns:name>王五</ns:name></ns:user>
</root>'''
ns = {'ns': 'http://ipipp.com/ns'}
root = ET.fromstring(xml_text)
name = root.find('ns:user/ns:name', ns)
print(name.text)
小结
提取XML特定数据的核心是先解析成树,再用find、findall或XPath定位。遇到命名空间时记得声明前缀。掌握这些方法,处理各类XML配置和报文就会轻松很多。