2011-01-10 9 views
27

ich einige Code zu schreiben bin versucht, in einer * CSPROJ Datei mit C#Lesen einer * CSPROJ Datei in C#

Der Code I haben zu lesen, wie

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

mit dem Debugger folgt I kann sehen, dass ‚fullPathName“ hat den richtigen Wert und die xmldoc einmal geladen hat, die richtigen Inhalte.

die xmldoc keine hat ‚Knoten‘, obwohl, als ob der Inhalt als XML nicht erkannt werden.

Mit einem XML-Editor validiert die * .csproj-Datei ein XML-Dokument.

Wohin gehe ich falsch?

Antwort

16

Sie wurden mit XmlNamespaceManager zusätzlich immer in der Nähe, aber waren nicht in Gebrauch ist in der Select Methode:

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

(Ich wechselte zu einem anderen Elemente zu suchen, wie mein Projekt keine eingebetteten Ressourcen hat)

9

der Vollständigkeit halber hier die XDocument Version vereinfacht diese Namespace Management:

 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; 
     } 
48

Warum verwenden Sie die MSBuild API nicht?

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 
} 

Sie benötigen die Microsoft.Build.Engine Montage

+2

Das Projekt Klasse von Microsoft.Build.Engine zu referenzieren ist veraltet. Irgendeine Idee, wie Sie die Entsprechung mit der Projektklasse von Microsoft.Build.Evaluation (Assembly Microsoft.Build) tun? –

+0

@ValeryLetroye, ich habe es nicht versucht, aber ich denke, etwas wie 'project.Items.Where (i => i.ItemType ==" EmbeddedResource ") sollte funktionieren. –

+0

Genau das habe ich gesucht! Eine gute Möglichkeit, alle referenzierten Msbuild-Ziele und ihre Überschreibungen zu respektieren! Dies sollte aus technischer Sicht die bessere Lösung sein. – Chris