Python用objectify解析XML时hasattr确认存在的text属性getattr返回None
问题根源
你遇到的是lxml.objectify的原生属性和XML子节点命名冲突问题:
- lxml.objectify封装的XML元素本身自带
text原生属性,用途是存储当前节点的直接文本内容,优先级高于同名子节点的属性映射 hasattr(self.xml_data, 'text')返回True是因为检测到了元素自带的原生text属性,不是你要的子节点- 你的prod根节点没有直接文本内容,所以调用
getattr(self.xml_data, 'text')拿到的是原生text属性的空值None,vars输出里的元素是子节点映射,被原生属性覆盖了 - uri属性可以正常读取是因为
uri不是lxml元素的原生属性,不会触发冲突
解决方法
你可以任选以下两种方式读取子节点,避免命名冲突:
- 沿用你已经验证可用的find方法
cdef textt = self.xml_data.find('text')
- 用objectify的字典式访问明确取子节点,这种方式不会触发原生属性查找
cdef textt = self.xml_data['text']
修改后你的原有逻辑不需要做其他调整,就能正常读取name属性了。
内容的提问来源于stack exchange,提问作者DeadSec
相关产品推荐
相关产品推荐

