2009-11-16 147 views
1

我想问一个oldie(但是好的)Reading the list of References from csproj files(尽管我不是那个问题的作者)的后续问题。Linq to XML,只接受具有某个子元素的元素

在我的文件的csproj解析,我需要选择具有链接元素作为孩子的所有编译元素。

我第一次尝试的答案延伸到链接的问题如下:

IEnumerable<string> links = csprojFile 
     Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Compile") 
     .Where(element => element.HasElements) 
     .Attributes("Include") 

这显然是不够的,因为它选择具有任何类型的孩子的所有元素(因此而选择我想要的一些中,也挑选额外)。所以然后我尝试:

IEnumerable<string> links = csprojFile 
     .Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Compile") 
     .Where(element => element.HasElements && element.Descendants("Link").Any()) 
     .Attributes("Include") 
     .Select(element => element.Value); 

...它不返回任何东西。我是Linq的初学者,尤其是Linq2XML的初学者,但对我来说,“Where”子句说:“元素有孩子,至少有一个孩子名为Link”。那是错的吗?

非常感谢帮助。

回答

3

我怀疑这是一个名称空间问题 - 您没有使用“链接”命名空间。试试这个:

IEnumerable<string> links = csprojFile 
     .Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Compile") 
     .Where(element => element.Descendants(msbuild + "Link").Any()) 
     .Attributes("Include") 
     .Select(attr => attr.Value); 

(该HasElements是不是真的有必要)

+1

工程就像一个魅力,谢谢。我知道它应该在那里,而且在我看来它是(它显然超过了我的眼睛看到的),有时需要另一个人指出(并笑)显然:) – 2009-11-16 20:01:51