2009-07-27 2 views
24

Кто-нибудь знает, как программно прочитать список ссылок в файле VS2008 csproj? MSBuild, похоже, не поддерживает эту функцию. Я пытаюсь прочитать узлы, загружая файл csproj в XmlDocument, но поиск XPath не возвращает никаких узлов. Я использую следующий код:Чтение списка ссылок из файлов csproj

System.Xml.XmlDocument projDefinition = new System.Xml.XmlDocument(); 
     projDefinition.Load(fullProjectPath); 

     System.Xml.XPath.XPathNavigator navigator = projDefinition.CreateNavigator(); 

     System.Xml.XPath.XPathNodeIterator iterator = navigator.Select(@"/Project/ItemGroup"); 
     while (iterator.MoveNext()) 
     { 
      Console.WriteLine(iterator.Current.Name); 
     } 

Если я могу получить список ItemGroups я могу определить, содержит ли он Справочную информацию или нет.

ответ

37

XPath должен быть /Project/ItemGroup/Reference, и вы забыли пространство имен. Я бы просто использовал XLINQ - дело с пространствами имен в XPathNavigator довольно беспорядочно. Итак:

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
    XDocument projDefinition = XDocument.Load(fullProjectPath); 
    IEnumerable<string> references = projDefinition 
     .Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Reference") 
     .Select(refElem => refElem.Value); 
    foreach (string reference in references) 
    { 
     Console.WriteLine(reference); 
    } 
+0

Это было намного проще. Спасибо за помощь. – 2009-07-28 14:53:40

+0

Это здорово! К настоящему времени все, вероятно, заметили это, но на всякий случай - ссылки могут быть также сделаны в рамках решения, в таком случае вам также нужно получить элемент «ProjectReference». – astrowalker

6

Опираясь на ответ @Pavel Минаева, это то, что работает для меня (обратите внимание на добавленную .Attributes строку для чтения Включить атрибут)

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
    XDocument projDefinition = XDocument.Load(@"D:\SomeProject.csproj"); 
    IEnumerable<string> references = projDefinition 
     .Element(msbuild + "Project") 
     .Elements(msbuild + "ItemGroup") 
     .Elements(msbuild + "Reference") 
     .Attributes("Include") // This is where the reference is mentioned  
     .Select(refElem => refElem.Value); 
    foreach (string reference in references) 
    { 
     Console.WriteLine(reference); 
    } 
4

на основе @ PavelMinaev отвечают, я тоже добавлен элемент «HintPath» к выходу. Я пишу строковый массив «ссылки» в файл «.txt».

XNamespace msbuild = "http://schemas.microsoft.com/developer/msbuild/2003"; 
      XDocument projDefinition = XDocument.Load(@"C:\DynamicsFieldsSite.csproj"); 
      var references = projDefinition 
       .Element(msbuild + "Project") 
       .Elements(msbuild + "ItemGroup") 
       .Elements(msbuild + "Reference") 
       .Select(refElem => (refElem.Attribute("Include") == null ? "" : refElem.Attribute("Include").Value) + "\n" + (refElem.Element(msbuild + "HintPath") == null ? "" : refElem.Element(msbuild + "HintPath").Value) + "\n"); 
      File.WriteAllLines(@"C:\References.txt", references);