UWP - 如何从http获取文件(xml)?

时间:2016-07-03 21:24:02

标签: c# uwp

我有这个代码加载xml(到List),它工作正常:

public MainPage()
{
    this.InitializeComponent();
    string XMLFilePath = Path.Combine(Package.Current.InstalledLocation.Path, "something.xml");
    XDocument loadedData = XDocument.Load(XMLFilePath);
}

如果我想从我的服务器调用xml怎么办?

这是最后一次尝试:

using System.Net.Http;
using System.Runtime.Serialization.Json;

...

private string jsonString;

    public MainPage()
    {
        this.InitializeComponent();

        loadData();

        //string XMLFilePath = Path.Combine(Package.Current.InstalledLocation.Path, "something.xml");
        XDocument loadedData = XDocument.Load(jsonString);

...

private async void loadData()
    {
        var httpClient = new HttpClient();
        HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://domain.com/something.xml"));
        jsonString = await response.Content.ReadAsStringAsync();
    }

这是错误:

An exception of type 'System.ArgumentNullException' occurred in System.Xml.ReaderWriter.dll but was not handled in user code

任何帮助都会很棒。

感谢。

3 个答案:

答案 0 :(得分:4)

您只需使用XmlDocument.LoadFromUriAsync | loadFromUriAsync methods从指定位置异步加载XML文档即可。此位置也可以是Http链接。

这里只是为了一个非常简单的测试:

<TextBlock x:Name="txt" />
代码背后的代码:

protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    XmlDocument xmlDoc = await XmlDocument.LoadFromUriAsync(new Uri("http://domain.com/something.xml"));
    txt.Text = xmlDoc.GetXml().ToString();
}

请注意,此处xml文档的命名空间为Windows.Data.Xml.Dom,而不是System.Xml。我注意到你的Uri地址就像http://domain.com/something.xml,也许你正在使用本机服务器,在这样做时,你可能需要在项目的清单文件中启用Private Networks(Client & Server)功能。

<强>更新

抱歉,我不知道您要使用LinQ,使用XDocument加载xml,基本上有两种方法:来自字符串Uri或来自流,但对于第一种方法, Uri参数必须是文件系统相对或绝对路径。

因此,这里有一种方法是您可以将xml保存到本地文件并使用XDocument再次加载它,或者您可以使用stream来实现此目的,例如:

HttpClient client = new HttpClient();
var response = await client.GetStreamAsync("http://domain.com/something.xml");
XDocument xmlDoc = XDocument.Load(response);
txt.Text = xmlDoc.Document.ToString();

答案 1 :(得分:1)

你需要指定地址,尝试这样的事情:

public MainPage()
{
this.InitializeComponent();
string XMLFilePath = @"http://www.msn.com";
XmlDocument LoadedData = new XmlDocument();
LoadedData.Load(XMLFilePath);
}

如果要使用XDocument对象,请尝试使用方法“Parse”而不是“Load”。

答案 2 :(得分:0)

您的私有异步void loadData()不是await,jsonString为null。 你可以

private async void loadData()
{
    var httpClient = new HttpClient();
    HttpResponseMessage response = await httpClient.GetAsync(new Uri("http://domain.com/something.xml"));
    jsonString = await response.Content.ReadAsStringAsync();
    XDocument loadedData = XDocument.Load(jsonString);
}

 public MainPage()
 {
    this.InitializeComponent();

    loadData();
 }