Чтение файла * .CSPROJ в C # - PullRequest
31 голосов
/ 10 января 2011

Я пытаюсь написать некоторый код для чтения в * .CSPROJ-файле, используя C #

У меня следующий код:

   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();
   }

с использованием отладчика. Я вижу, что 'fullPathName "имеет правильное значение, а xmldoc после загрузки имеет правильное содержимое.

У xmldoc нет никаких" узлов ", как если бы содержимое не распознавалось как XML.

ИспользованиеXML-редактор. Файл * .csproj проверяет XML-документ.

Где я ошибаюсь?

Ответы [ 3 ]

57 голосов
/ 10 января 2011

Почему бы не использовать 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
}

Вам необходимо обратиться к сборке Microsoft.Build.Engine

18 голосов
/ 10 января 2011

Вы приближались к своему добавлению 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();
}

(я переключился на поиск другого элемента, поскольку в моем проекте не было встроенных ресурсов)

9 голосов
/ 10 января 2011

Для полноты здесь версии 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;
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...