我尝试从visual studio * .csproj文件查询元素.我创建了一个简单的例子来说明问题:
// Working string xml1 = @"<Project ToolsVersion='4.0'> <ItemGroup Label='Usings'> <Reference Include='System' /> <Reference Include='System.Xml' /> </ItemGroup> </Project>"; // Not working string xml2 = @"<Project ToolsVersion='4.0' xmlns='http://schemas.microsoft.com/developer/msbuild/2003'> <ItemGroup Label='Usings'> <Reference Include='System' /> <Reference Include='System.Xml' /> </ItemGroup> </Project>"; XDocument doc = XDocument.Parse(xml2); foreach (XElement element in doc.Descendants("ItemGroup")) { Console.WriteLine(element); }
字符串xml1工作正常,xml2不返回任何东西.这些字符串之间的唯一区别是文档根目录中的xmlns属性.
解决方法
Why is it a problem when a xml document contains an xmlns attribute?
这不是,如果你明白这是什么意思:)基本上你已经应用了所有元素的默认命名空间URI“http://schemas.microsoft.com/developer/msbuild/2003”.所以当查询时,你也需要指定这个命名空间.幸运的是,LINQ to XML使得它非常简单:
XNamespace ns = "http://schemas.microsoft.com/developer/msbuild/2003"; XDocument doc = XDocument.Parse(xml2); foreach (XElement element in doc.Descendants(ns + "ItemGroup")) { Console.WriteLine(element); }