2011-10-01 58 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

相关问题