当根元素通过XDocument具有属性时,搜索XML元素

时间:2014-04-28 13:38:08

标签: c# linq-to-xml

我想从项目文件(* .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>  

我该怎么做才能修复代码,以便代码正常工作,项目仍然是原始代码?

更新

当我向文件添加新元素时,它会自动添加命名空间

提前致谢。

2 个答案:

答案 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