2011-01-10 20 views
27

ayıklayıcı I kullanılarakC# a * .Csproj dosyasını okuma C# kullanarak bir * .Csproj dosyasını okumak üzere kod yazmak çalışılıyor

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

şöyle Ben kodu

'fullPathname" doğru değeri vardır ve yüklendikten sonra xmldoc doğru içeriğe sahiptir.

xmldoc herhangi yoktur 'görebiliriz içeriği XML olarak tanınmayan sanki olsa Düğümleri'.

Bir XML düzenleyicisi kullanarak * .csproj dosyası bir XML belgesini doğrular.

Neredeler?

cevap

16
Sen XmlNamespaceManager eklenmesiyle yaklaştığımızı ama SelectNodes yöntemde kullanmadan değildi

: Projemi herhangi gömülü kaynak yoktu olarak

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

(Farklı eleman ararken geçti

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

XDocument sürümü, bu ad yönetimini kolaylaştırır?

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 
} 

Sen Microsoft.Build.Engine takımını

48

Neden MSBuild API kullanmayın:)

burada tamlığı için
+2

Microsoft.Build.Engine Proje sınıfı artık önerilmemektedir başvurmak gerekir. Microsoft.Build.Evaluation (derleme Microsoft.Build) 'dan Project sınıfı ile eşdeğer nasıl yapılır herhangi bir fikir? –

+0

@ValeryLetroye, Denemedim, ama sanırım bir şey 'project.Items.Where (i => i.ItemType == "EmbeddedResource") 'çalışmalıdır. –

+0

Tam olarak aradığım şey bu! Tüm başvurulan msbuild hedeflerine ve geçersiz kılmalarına saygı duymanın harika bir yolu! Bu teknik açıdan daha iyi bir çözüm olmalı. – Chris

İlgili konular