2012-03-04 29 views
11

Tôi đang cố gắng tìm ra cách để chuyển một số mã .Net phân tích tệp xml thành WinRT. Cho đến nay, với sự giúp đỡ của The given System.Uri cannot be converted into a Windows.Foundation.Uri, tôi có mã dưới đây. Tuy nhiên, tôi gặp khó khăn ngay lập tức sau khi tôi tạo ra Uri:Cách mở tệp được đóng gói với WinRT

static readonly Uri ResourcesBase = new Uri(@"ms-resource://MyAssembly/"); 
    public override async void Load() 
    { 
     Uri uri = new Uri(ResourcesBase, filePath); // filePath = "Data//world.xml"; 
     XmlLoadSettings settings = new XmlLoadSettings() { ValidateOnParse = false }; 

     XmlDocument xmlDoc = await XmlDocument.LoadFromUriAsync(uri, settings); 

     foreach (IXmlNode xmlNode in xmlDoc.ChildNodes) 
     { 
      ProcessNode(xmlNode); 
     } 
    } 

tôi nhận được một ngoại lệ unhandled khi tôi cố gắng gọi XmlDocument.LoadFromUriAsyn (uri):

ArgumentException là unhandled bởi mã sử dụng - Giá trị thực hiện không nằm trong phạm vi dự kiến.

Bất kỳ ai khác cảm thấy mọi thứ khó hơn gấp 10 lần với WinRT?

EDIT:

Tôi đã thử tất cả các chuỗi sau, và nhận được cùng một lỗi chính xác:

Uri uri = new Uri("ms-resource://MyAssembly//" + filePath); 
    Uri uri = new Uri("ms-resource://MyAssembly/" + filePath); 
    Uri uri = new Uri("d:\\projects\\crystal\\" + filePath); // A valid absolute path 

Dự án Thiết lập:

Dự án

  • Thuộc tính
  • Tài liệu tham khảo
  • Tài sản
  • liệu
    • world.xml đang
  • Nguồn ...

Trong Mã số:

filePath = "Data\\world.xml"; 

Tôi cũng đã thử đặt xml tệp dưới dạng assset \ data và chỉ nội dung. Không có gì có vẻ tạo nên sự khác biệt.

Một điều nữa, tôi có Action Build của tập hợp xml thành "Content". Đúng không? Điều duy nhất tôi có thể tưởng tượng rằng nó sẽ là "Tài nguyên nhúng" nhưng tôi nghi ngờ điều đó.

Full chi tiết Ngoại lệ:

System.ArgumentException là unhandled bởi người dùng mã

HRESULT = -2147024809

nhắn = Giá trị không nằm trong phạm vi dự kiến.

Source = Windows.Data.Xml.Dom

StackTrace:

tại Windows.Data.Xml.Dom.XmlDocument.LoadFromUriAsync (Uri uri, XmlLoadSettings loadSettings)

tại Crystal.IO .File.XmlFileSerializer.d__1.MoveNext() trong d: \ Projects \ Crystal \ library \ IO \ File \ XmlFileSerializer.cs: dòng 32

InnerException:

Tải ví dụ nhỏ nhất có thể để repro vấn đề: test_xml.zip

+0

Bạn không chỉ có dấu gạch chéo đơn? I E. 'Uri uri = new Uri (" ms-resource: // MyAssembly/"+ filePath);'. –

+0

Chỉ có 1 dấu gạch chéo, hoặc đường dẫn tệp tuyệt đối (c: \ ...) cả hai đều không có hiệu ứng khác nhau. –

+0

Bạn có thể cho chúng tôi biết tệp 'tệpPath' trông như thế nào không? – user7116

Trả lời

16

Cuối cùng tôi figured it out sau khi tôi nhìn Windows Runtime Xml data API sample.

public override async Load() 
    { 
     var file = await GetPackagedFile("assets", "world.xml"); 
     LoadXml(file); 
    } 

    private async void LoadXml(StorageFile file) 
    { 
     XmlLoadSettings settings = new XmlLoadSettings() { ValidateOnParse = false }; 
     XmlDocument xmlDoc = await XmlDocument.LoadFromFileAsync(file, settings); 

     foreach (IXmlNode xmlNode in xmlDoc.ChildNodes) 
     { 
      //ProcessNode(xmlNode); 
     } 
    } 

    private async Task<StorageFile> GetPackagedFile(string folderName, string fileName) 
    { 
     StorageFolder installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation; 

     if (folderName != null) 
     { 
      StorageFolder subFolder = await installFolder.GetFolderAsync(folderName); 
      return await subFolder.GetFileAsync(fileName); 
     } 
     else 
     { 
      return await installFolder.GetFileAsync(fileName); 
     } 
    } 
} 
Các vấn đề liên quan