如何处理XSD文档中vc:minVersion元素缺失时无返回结果的问题?
解决方案
你的问题出在:当文档里没有vc:minVersion属性时,xpath('//@vc:minVersion')会返回一个空列表,for循环根本不会执行,所以不会进入任何分支输出内容。
修改思路是先获取所有匹配的结果,先判断是否存在该属性,再做后续处理:
import lxml.etree as ET dom = ET.parse(u'cbs.xsd') rootxml = dom.getroot() nss = rootxml.nsmap # 先获取所有匹配的vc:minVersion属性值 min_versions = rootxml.xpath(u'//@vc:minVersion', namespaces=nss) if not min_versions: print('vc:minVersion 未找到') else: for subtag in min_versions: print(subtag) if subtag == '1.1': print('Found! 1.1 version') elif subtag == '1.0': print('Found! 1.0 version') else: print(f'找到未知版本: {subtag}')
如果你的XSD文档里只会有一个vc:minVersion属性,也可以简化成直接取第一个结果(用xpath('string(//@vc:minVersion)')),空值时返回空字符串:
import lxml.etree as ET dom = ET.parse(u'cbs.xsd') rootxml = dom.getroot() nss = rootxml.nsmap # 直接获取第一个匹配的属性值,无匹配则返回空字符串 min_version = rootxml.xpath(u'string(//@vc:minVersion)', namespaces=nss) if not min_version: print('vc:minVersion 未找到') elif min_version == '1.1': print('Found! 1.1 version') elif min_version == '1.0': print('Found! 1.0 version') else: print(f'找到未知版本: {min_version}')
关键说明
xpath('//@vc:minVersion')返回的是匹配到的属性值列表,无匹配时为空列表,for循环不会执行string(//@vc:minVersion)会返回第一个匹配到的属性值的字符串形式,无匹配时返回空字符串,适合单个属性的场景
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

