You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ElementTree解析NuGet的.targets文件无法找到<AdditionalIncludeDirectories>标签

解决ElementTree解析MSBuild .targets文件时无法找到的问题

你的问题出在两个核心点:

  • findall(to_find) 默认只查找当前节点的直接子节点,但<AdditionalIncludeDirectories>是嵌套在ItemDefinitionGroup→ClCompile下的深层节点
  • 命名空间的处理可以更规范,避免手动字符串替换可能带来的潜在问题

原因详解

从你遍历输出的节点层级能看到,目标节点是根节点下第2层的后代节点,而config_root.findall(to_find)只会检查根节点的直接子元素(也就是depth 0的那些节点),自然找不到深层的AdditionalIncludeDirectories。

解决方案

方法1:使用递归查找语法.//

通过.//前缀可以让findall递归查找所有后代节点,结合正确的命名空间前缀即可定位目标元素:

import xml.etree.ElementTree as ET

tree = ET.parse(targets_file_path)
config_root = tree.getroot()
# 提取XML命名空间
namespace = config_root.tag.split('}')[0].strip('{')
# 构造带递归查找路径的查询字符串
to_find = f'.//{{{namespace}}}AdditionalIncludeDirectories'
include_dirs = config_root.findall(to_find)

# 提取节点文本内容
include_directory_list = [p.text.strip() for p in include_dirs]
print(include_directory_list)

方法2:使用命名空间字典(更规范)

ElementTree支持通过命名空间字典来查询,可读性和维护性更强:

import xml.etree.ElementTree as ET

tree = ET.parse(targets_file_path)
config_root = tree.getroot()
# 定义命名空间字典,前缀可自定义(比如msbuild)
ns = {'msbuild': 'http://schemas.microsoft.com/developer/msbuild/2003'}
# 结合命名空间前缀与递归查找语法
include_dirs = config_root.findall('.//msbuild:AdditionalIncludeDirectories', namespaces=ns)

# 提取节点文本内容
include_directory_list = [p.text.strip() for p in include_dirs]
print(include_directory_list)

验证结果

两种方法都能正确提取到目标节点的内容:['$(MSBuildThisFileDirectory)native\\include\\;%(AdditionalIncludeDirectories)']

内容的提问来源于stack exchange,提问作者meetaig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 13:07:37