使用xmlstarlet读取MSVS vcxproj项目源文件失效问题
问题原因
- xmlstarlet 中用于匹配默认命名空间的
_:前缀仅对当前标注前缀的单个节点生效,不会沿XPath路径自动继承给子节点。初始查询命令//_:ItemGroup/ClCompile/@Include仅为父节点ItemGroup添加了命名空间匹配标识,子节点ClCompile未加前缀,会被识别为无命名空间节点,与vcxproj文件内处于MSBuild默认命名空间下的实际ClCompile节点不匹配,因此无法返回结果。 - 精简测试无输出的核心错误:测试所用XPath
//_:ItemGroup/@Include的查询目标是ItemGroup节点自身的Include属性,但实际Include属性挂载在ItemGroup的子节点ClCompile上,节点层级选择错误,自然无返回内容。 - 前期简单测试可正常运行,是因为测试用XPath路径中的目标节点
SUB_ELEMENT明确添加了_:前缀,路径指向完全准确,不存在漏加前缀、层级匹配错误的问题。
正确实现方法
提取所有源文件路径
执行以下命令即可提取vcxproj中所有C/C++源文件的路径:
xmlstarlet sel -t -v "//_:ItemGroup/_:ClCompile/@Include" -n myProj.vcxproj
使用构造的精简vcxproj样例运行该命令,可得到预期输出:
$(SrcDir)d1\f1cpp
提取包含目录
MSVS项目的包含目录一般配置在PropertyGroup节点下的IncludePath字段,提取命令如下:
xmlstarlet sel -t -v "//_:PropertyGroup/_:IncludePath" -n myProj.vcxproj
若项目针对不同构建配置(Debug/Release、x86/x64)设置了独立的包含目录,可在XPath中增加条件判断,筛选对应配置的
PropertyGroup节点即可精准提取目标值。
内容的提问来源于stack exchange,提问作者tpb261
相关产品推荐
相关产品推荐

