在C#中读取*.CSPROJ文件

BEN*_*der 31 c# xml

我试图用C#编写一些代码来读取*.CSPROJ文件

我的代码如下

   XmlDocument xmldoc = new XmlDocument();
   xmldoc.Load(fullPathName);

   XmlNamespaceManager mgr = new XmlNamespaceManager(xmldoc.NameTable);
   //mgr.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003");

   foreach (XmlNode item in xmldoc.SelectNodes("//EmbeddedResource") )
   {
      string test = item.InnerText.ToString();
   }
Run Code Online (Sandbox Code Playgroud)

使用调试器我可以看到'fullPathName'具有正确的值,并且加载后的xmldoc具有正确的内容.

xmldoc没有任何"节点",好像内容不被识别为XML.

使用XML编辑器,*.csproj文件验证XML文档.

我哪里错了?

Tho*_*que 57

为什么不使用MSBuild API?

Project project = new Project();
project.Load(fullPathName);
var embeddedResources =
    from grp in project.ItemGroups.Cast<BuildItemGroup>()
    from item in grp.Cast<BuildItem>()
    where item.Name == "EmbeddedResource"
    select item;

foreach(BuildItem item in embeddedResources)
{
    Console.WriteLine(item.Include); // prints the name of the resource file
}
Run Code Online (Sandbox Code Playgroud)

您需要引用Microsoft.Build.Engine程序集

  • VS2017:`Install-Package Microsoft.Build`和`Install-Package Microsoft.Build.Utilities.Core` (6认同)
  • 现在不推荐使用Microsoft.Build.Engine的Project类.任何想法如何与Microsoft.Build.Evaluation(程序集Microsoft.Build)中的Project类等效? (5认同)

Ric*_*ard 18

您正在接近添加XmlNamespaceManager,但未在SelectNodes方法中使用它:

XmlNamespaceManager mgr = new XmlNamespaceManager(xmldoc.NameTable);
mgr.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003");

foreach (XmlNode item in xmldoc.SelectNodes("//x:ProjectGuid", mgr))
{
    string test = item.InnerText.ToString();
}
Run Code Online (Sandbox Code Playgroud)

(我切换到搜索不同的元素,因为我的项目没有任何嵌入资源)


Bro*_*ass 9

为了完整性,这里是XDocument版本,这简化了命名空间管理:

        XDocument xmldoc = XDocument.Load(fullPathName);
        XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003";

        foreach (var resource in xmldoc.Descendants(msbuild + "EmbeddedResource"))
        {
            string includePath = resource.Attribute("Include").Value;
        }
Run Code Online (Sandbox Code Playgroud)