2011-10-01 60 views
1

我必須在我的Silverlight應用程序中打開並讀取一個xml文件。我不能把這個文件放在資源中(我的老師的意願)。我試圖用這個代碼:Silverlight,從外部應用程序包打開xml

XmlReader reader = XmlReader.Create("products.xml"); 

,但得到了一個錯誤:

Cannot find file 'products.xml' in the application xap package. 

此xml文件目前位於旁邊調試文件夾中的.xap

我應該怎麼做,使之工作? (萬一)

XML文件:

<products> 
    <product> 
    <name>nameA</name> 
    <desc>descA</desc> 
    <image>imgA</image> 
    </product> 
    <product> 
    <name>nameB</name> 
    <desc>descB</desc> 
    <image>imgb</image> 
    </product> 
    <product> 
    <name>nameC</name> 
    <desc>descC</desc> 
    <image>imgC</image> 
    </product> 
</products> 

錯誤陷入了安東尼的代碼returnResult(args.Result);

System.Reflection.TargetInvocationException: An exception occurred during the operation, making the result invalid. Check InnerException for exception details. ---> System.Net.WebException: An exception occurred during a WebClient request. ---> System.NotSupportedException: The URI prefix is not recognized. 
    in System.Net.WebRequest.Create(Uri requestUri) 
    in System.Net.WebClient.GetWebRequest(Uri address) 
    in System.Net.WebClient.OpenReadAsync(Uri address, Object userToken) 
    --- The end of stack trace of inner exceptions (my translation) --- 
    in System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() 
    in System.Net.OpenReadCompletedEventArgs.get_Result() 
    in ProjektAI.MainPage.<>c__DisplayClass1.<GetStreamFromUri>b__0(Object s, OpenReadCompletedEventArgs args) 
+0

如果這是家庭作業,您應該在其上安裝#homework標籤 –

+0

Normal Silverlight僅支持讀取隔離存儲中的文件或使用OpenFileDialog –

回答

3

您需要的WebClient幫助下載xml文件首先從網絡服務器。這裏有一個實用的方法來幫助。然後

public static void GetStreamFromUri(Uri uri, Action<Stream> returnResult) 
{ 
     WebClient client = new WebClient(); 
     client.OpenReadCompleted += (s, args) => 
     { 
      returnResult(args.Result); 
     }; 
     client.OpenReadAsync(uri); 
} 

您的代碼將使用: - 到目前爲止,你已經寫

GetStreamFromUri(new Uri("products.xml", UriKind.Relative), stream => 
{ 
    using (stream) 
    { 
     XmlReader reader = XmlReader.Create(stream); 

     // Rest of reader processing code called here. 
    } 
}); 

// Note really really well: **Code here will run before XmlReader processing** 

可能是代碼的工作同步進行。 Silverlight允許在XAP中找到的資源同步加載和處理。但是網絡操作總是異步的。我的猜測是「(我的老師的意願)」實際上是你學習了Silverlight編碼的這個重要的異步方面,它對你編碼的方式有什麼影響。

+0

代碼中有3個小錯誤。我糾正了它們,並試圖運行你的代碼(沒有進一步的修改)。不幸的是,在returnResult(args.Result)中存在一個異常:「在操作過程中發生異常,導致結果無效,請檢查InnerException以獲取異常詳細信息。」我把我的XML文件放在問題中以防萬一。 – gisek

+0

@gisek:我發現兩個與OpenReadCompleted相關,但我看不到第三個?什麼是內部例外?在OpenReadCompleted中放置一個'try..catch'並在MessageBox.Show(err.ToString())這樣的catch中做一些傻事,給你一個放置斷點的地方。您正在使用WebServer主機? 「products.xml」應該在Xap的Web項目的ClientBin文件夾中,這是否會發生? – AnthonyWJones

+0

第三個錯誤:GetStreamFromUri(Uri url < - URL和您使用的方式:OpenReadAsync(uri < - URI; 錯誤添加到問題中 – gisek

相關問題