2011-01-10 40 views
27

Tôi đang cố gắng để viết một số mã để đọc trong một tập tin * csproj sử dụng C#Đọc một tập tin * csproj trong C#

Mã tôi có là như sau

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

sử dụng trình gỡ lỗi tôi có thể thấy rằng 'fullPathName" có giá trị đúng và xmldoc lần nạp có các nội dung chính xác.

các xmldoc không có bất kỳ 'nút' Mặc dù vậy, như thể các nội dung không được công nhận là XML.

Sử dụng trình soạn thảo XML tệp * .csproj xác nhận hợp lệ một tài liệu XML.

Tôi sẽ làm gì sai?

Trả lời

16

Bạn đã nhận được gần gũi với Ngoài XmlNamespaceManager của bạn, nhưng không được sử dụng nó trong các SelectNodes phương pháp:

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

(Tôi chuyển sang tìm kiếm một yếu tố khác nhau như dự án của tôi không có bất kỳ tài nguyên nhúng)

9

Đối với đầy đủ ở đây phiên bản XDocument, điều này giúp đơn giản hoá quản lý không gian tên:

 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

Tại sao không sử dụng 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 
} 

Bạn cần phải tham khảo lắp ráp Microsoft.Build.Engine

+2

Lớp Dự án Microsoft.Build.Engine hiện đang bị phản đối. Bất kỳ ý tưởng làm thế nào để làm tương đương với các lớp dự án từ Microsoft.Build.Evaluation (lắp ráp Microsoft.Build)? –

+0

@ValeryLetroye, tôi đã không thử nó, nhưng tôi nghĩ rằng một cái gì đó giống như 'project.Items.Where (i => i.ItemType ==" EmbeddedResource ")' nên làm việc. –

+0

Đây chính xác là những gì tôi đang tìm kiếm! Một cách tuyệt vời để tôn trọng tất cả các mục tiêu msbuild được tham chiếu và ghi đè của chúng! Đây sẽ là giải pháp tốt hơn từ góc độ kỹ thuật. – Chris

Các vấn đề liên quan