我想从项目文件(* .csproj文件)中搜索下面的元素
<ItemGroup>
<Reference Include="C.ClassLibrary3, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\C.ClassLibrary3.dll</HintPath>
</Reference>
<Reference Include="System" />
</ItemGroup>
项目文件如下,请注意Project元素的属性:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Reference Include="C.ClassLibrary3, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\Lib\C.ClassLibrary3.dll</HintPath>
</Reference>
<Reference Include="System" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
</Project>
代码如下:
var projectFile = XDocument.Load(projectFilePath);
var itemGroup = projectFile
.Descendants("ItemGroup")
.Where(x =>x.Elements("Reference").Elements("HintPath").Any())
.ToList();
问题是上面的代码仅在项目元素更改为下面后才能工作(删除所有属性。):
<Project>
我该怎么做才能修复代码,以便代码正常工作,项目仍然是原始代码?
更新
当我向文件添加新元素时,它会自动添加命名空间
提前致谢。
答案 0 :(得分:0)
尝试使用以下XElement,确保为查询的每个元素指定命名空间:
XElement xml= XElement.Load("file.xml");
XNamespace ns= xml.Name.Namespace;
var groups = xml.Elements(ns+ "ItemGroup");
如果你不想在任何地方使用ns
,你可以加载xml,遍历所有元素并将namespace属性设置为空字符串,或者你可以实现自定义方法来给你正确的名:
public static XNamespace ns = @"http://schemas.microsoft.com/developer/msbuild/2003";
public static XName MsElementName(string baseName)
{
return ns + baseName;
}
并使用如下:
var groups = xml.Elements(MsElementName("ItemGroup"));
答案 1 :(得分:0)
您的Project
元素中有一个名称空间。因此您需要在元素名称中指定它:
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003";
var itemGroup = projectFile
.Descendants(ns +"ItemGroup")
.Where(x =>x.Elements(ns + "Reference").Elements(ns +"HintPath").Any())
.ToList();
有关详细信息,请参阅How to: Write Queries on XML in Namespaces
。