2009-07-27 22 views
24

Czy ktoś wie o sposobie, aby programowo odczytać listę odniesień w pliku csproj VS2008? MSBuild nie obsługuje tej funkcji. Próbuję odczytać węzły, ładując plik csproj do XmlDocument, ale wyszukiwanie XPath nie zwraca żadnych węzłów. Używam następującego kodu:Czytanie listy odniesień z plików 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); 
     } 

Jeśli mogę uzyskać listę grup pozycji, mogę określić, czy zawiera informacje referencyjne, czy nie.

Odpowiedz

37

XPath powinien być /Project/ItemGroup/Reference, a zapomniałeś przestrzeni nazw. Po prostu użyłbym XLINQ - zajmowanie się przestrzeniami nazw w XPathNavigator jest raczej nieporządne. Więc:

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

To było znacznie łatwiejsze. Dzięki za pomoc. –

+0

To jest świetne! Do tej pory wszyscy prawdopodobnie to zauważyli, ale na wszelki wypadek - w rozwiązaniu można również wprowadzić odwołania, w takim przypadku trzeba również uzyskać element "ProjectReference". – astrowalker

6

Opierając się na odpowiedź @Pavel Minaev, jest to, co pracował dla mnie (zauważ dodatkową linię .Attributes czytać Dołącz atrybut)

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

oparciu o użytkownika @ PavelMinaev odpowiedź, ja też dodano element "HintPath" do wyjścia. Napisam tablicę znaków "referencje" do pliku ".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);