Чтение файла *.CSPROJ в С#
Я пытаюсь написать некоторый код для чтения в файле *.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();
}
с помощью отладчика я вижу, что "fullPathName" имеет правильное значение, и xmldoc после загрузки имеет правильное содержимое.
У xmldoc нет никаких "Узлов", хотя содержимое не распознается как XML.
Используя XML-редактор, файл *.csproj проверяет XML-документ.
Где я иду не так?
Ответы
Ответ 1
Вы приближались к дополнению 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();
}
(я переключился на поиск другого элемента, так как у моего проекта не было встроенных ресурсов)
Ответ 2
Почему бы не использовать API MSBuild?
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
Ответ 3
Для полноты здесь версия 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;
}