使用lxml.objectify解析XML时,为何仅识别到一个installation元素实例?
解决lxml.objectify解析多同名子元素时仅显示一个实例的问题
我之前也踩过这个坑,这其实是lxml.objectify一个容易让人混淆的默认行为——它会根据子元素的数量动态返回不同类型:
- 当节点下只有一个同名子元素时,直接返回该元素的对象;
- 当有多个同名子元素时,返回一个包含所有元素的列表。
你看到的“仅存在一个实例”其实是误解,实际上root.installationsVisibles.installation是一个包含两个<installation>元素的列表,只是你可能没把它当成列表来处理。
验证与遍历代码示例
你可以用这段代码来确认并处理所有安装元素:
from lxml import objectify fileobject = open('TestRapportValid.xml') tree = objectify.parse(fileobject) root = tree.getroot() # 先确认installation的类型(会显示为列表类型) print(type(root.installationsVisibles.installation)) # 遍历所有installation元素,提取属性和子节点内容 for inst in root.installationsVisibles.installation: print(f"设备类型: {inst.type.text}") print(f"高度: {inst.get('hauteur')}") print(f"距离: {inst.get('distance')}\n")
强制统一返回列表的方法
如果想避免判断元素数量的麻烦,不管子元素多少都返回列表,可以用objectify.deannotate禁用动态返回行为:
from lxml import objectify fileobject = open('TestRapportValid.xml') tree = objectify.parse(fileobject) root = tree.getroot() # 禁用动态类型返回,强制所有子元素访问返回列表 objectify.deannotate(root, cleanup_namespaces=True) # 现在即使只有一个元素,也会返回列表 installations = root.installationsVisibles.findall('installation') for inst in installations: # 执行你的处理逻辑 pass
或者直接用XPath查询获取所有元素,结果天然是列表:
installations = root.xpath('//installationsVisibles/installation')
这样就能正确获取到所有的<installation>元素了。
内容的提问来源于stack exchange,提问作者Gus tutu
相关产品推荐
相关产品推荐

