Python untangle库是一款专门用于简化XML访问的工具,它可以将XML文档解析为对应的Python对象,让开发者无需编写复杂的节点遍历代码,直接通过属性调用的方式获取XML中的数据,大幅降低XML处理的复杂度。

untangle库的安装
untangle是第三方库,需要通过pip命令进行安装,在终端执行以下命令即可完成安装:
pip install untangle
基础使用:解析简单XML
首先准备一个简单的XML示例文件,假设文件名为test.xml,内容如下:
<user>
<name>张三</name>
<age>25</age>
<email>zhangsan@ipipp.com</email>
</user>
使用untangle解析该XML并访问节点数据的代码如下:
import untangle
# 解析XML文件
obj = untangle.parse('test.xml')
# 访问根节点下的子节点内容
print(obj.user.name.cdata) # 输出:张三
print(obj.user.age.cdata) # 输出:25
print(obj.user.email.cdata) # 输出:zhangsan@ipipp.com
这里的cdata属性用于获取节点的文本内容,untangle会将每个XML节点映射为对象的属性,多层嵌套的节点可以通过连续的点号访问。
处理带属性的XML节点
如果XML节点包含属性,untangle会将属性也映射为对象的属性,示例如下:
<book id="1001">
<title>Python编程入门</title>
<price>59.9</price>
</book>
解析并获取节点属性的代码:
import untangle
obj = untangle.parse('book.xml')
# 获取节点的属性
print(obj.book['id']) # 输出:1001
# 获取节点的文本内容
print(obj.book.title.cdata) # 输出:Python编程入门
print(obj.book.price.cdata) # 输出:59.9
处理重复的同名节点
当XML中存在多个同名的子节点时,untangle会将这些节点放在一个可迭代的列表中,示例如下:
<students>
<student>
<name>李四</name>
<score>90</score>
</student>
<student>
<name>王五</name>
<score>88</score>
</student>
</students>
遍历同名节点的代码:
import untangle
obj = untangle.parse('students.xml')
# 遍历所有student节点
for student in obj.students.student:
print(f"姓名:{student.name.cdata},分数:{student.score.cdata}")
上述代码会依次输出两个学生的姓名和分数信息。
解析XML字符串
除了解析本地XML文件,untangle还支持直接解析XML格式的字符串,使用untangle.parse方法时传入字符串并在前面加上string:前缀即可:
import untangle
xml_str = '''<product>
<name>鼠标</name>
<price>99</price>
</product>'''
obj = untangle.parse(f'string:{xml_str}')
print(obj.product.name.cdata) # 输出:鼠标
print(obj.product.price.cdata) # 输出:99
注意事项
- untangle解析后的节点如果没有子节点,需要通过
cdata获取文本内容,如果直接打印节点对象会得到节点对象本身而非内容。 - 如果XML节点名称包含特殊字符或者Python关键字,可能无法直接通过属性访问,这种情况下建议使用其他XML解析库。
- untangle适合处理结构相对简单、规模不大的XML文档,对于超大型XML文件,其内存占用会比较高,不适合此类场景。
与常规XML解析方式对比
传统的xml.etree.ElementTree解析上述简单XML的代码如下:
import xml.etree.ElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()
name = root.find('name').text
age = root.find('age').text
email = root.find('email').text
print(name, age, email)
对比可以看出,untangle的代码更加简洁直观,不需要调用find方法,也不需要手动获取text属性,大幅减少了代码量。