使用lxml的xpath()查询Visual Studio项目文件仅返回空列表如何解决
问题根因
你遇到的查询无结果问题是由XML默认命名空间的匹配规则导致的。
你提供的VS项目文件根节点<Project>定义了默认命名空间 xmlns="http://schemas.microsoft.com/developer/msbuild/2003",文档内所有未显式指定前缀的节点都归属这个命名空间。而lxml执行xpath查询时,若未显式声明命名空间,默认只会匹配无命名空间的节点,因此所有查询都会返回空列表。
解决方案
步骤1:声明命名空间映射
调用xpath前先定义命名空间前缀映射,你可以自定义前缀名(示例中用ms指代微软msbuild命名空间):
ns = { 'ms': 'http://schemas.microsoft.com/developer/msbuild/2003' }
步骤2:携带命名空间执行xpath查询
编写xpath路径时,所有节点前都加上你定义的命名空间前缀,同时传入namespaces参数:
# 匹配Debug配置下的LinkerScript节点 v = self.tree.xpath('/ms:Project/ms:ItemDefinitionGroup[1]/ms:Link/ms:LinkerScript', namespaces=ns) # 直接提取文本内容的写法 linker_script_name = self.tree.xpath('/ms:Project/ms:ItemDefinitionGroup[1]/ms:Link/ms:LinkerScript/text()', namespaces=ns)[0] # 执行后linker_script_name的值为 STM32F437VI_flash.lds
可选:按配置条件筛选
如果你需要匹配指定配置(如Release)的LinkerScript,可以在xpath中添加属性条件筛选:
# 提取Release配置下的LinkerScript文件名 release_linker_script = self.tree.xpath( '/ms:Project/ms:ItemDefinitionGroup[@Condition="\'$(Configuration)|$(Platform)\'==\'Release|VisualGDB\'"]/ms:Link/ms:LinkerScript/text()', namespaces=ns )[0]
内容的提问来源于stack exchange,提问作者Scott Madeux
相关产品推荐
相关产品推荐

