读取XML文件在Xamarin

本文关键字:Xamarin 文件 XML 读取 | 更新日期: 2023-09-27 18:07:54

我是Xamarin的新手,我希望在可移植类库中读取XML文件。

文件可以嵌入或在线,我已经做了一些研究,并找到了两者的选项,但我发现的一切都过于复杂,这样一个简单的任务。我想知道是否有人有一个简单,干净的方法来完成这个。

唯一的规定是你使用可移植类库,以便iOS, Android和Windows Phone项目都可以使用相同的方法。

背景:基本上,我正在构建一个将放置在ListViewer中的项目列表。每个Item都有一个Name字符串和一个ImageSource字符串。我有包含我想要使用的信息的xml文档,我只需要一种在Xamarin中读取这些xml文件的简单方法。

感谢您提供的任何帮助!

读取XML文件在Xamarin

PCL无法访问System.IO。

我相信解决问题的一种方法是在PCL中添加xml文件作为资源,在FileStream对象中加载文件并使用StreamReader读取它,看看这篇文章

http://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/files/

虽然我建议你将文件转换为json,因为我不知道XML反序列化器是否在PCL中可用。

使用json,你可以使用json.net库并轻松使用你的文件。

我有。我使用在线存储的xml文件,将它们下载到流中,然后将流传递给XMLReader类。所有这些都是跨平台代码。

如果你想嵌入xml文件作为应用程序资源,正如@Dimitris Batsougiannis在他的评论中解释的那样,这是第二个选择。但是一旦你有了你的流代码将是相同的。简单地说,将流传递给BuildItemList方法。

public class ItemHelper
{
    public static bool IsReadingXML { get; set; }
    public static List<Item> ItemList { get; set; }
    public static void BeginReadXMLStream(string currFileName)
    {
        IsReadingXML = true;
        string ImagesRootFolder = "http://www.mywebsite.com/";
        HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(ImagesRootFolder + currFileName);
        httpRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), httpRequest);
    }
    private static void FinishWebRequest(IAsyncResult result)
    {
        IsReadingXML = true;
        HttpWebResponse httpResponse = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
        if (httpResponse.StatusCode == HttpStatusCode.OK)
        {
            Stream httpResponseStream = httpResponse.GetResponseStream();
            BuildItemList(httpResponseStream);
        }
    }
    public static void BuildItemList(Stream xmlStream)
    {
        string ImagesRootFolder = "http://www.mywebsite.com/";
        List<Item> returnValue = new List<Item>();
        try
        {
            using (XmlReader myXMLReader = XmlReader.Create((xmlStream)))
            {
                while (myXMLReader.Read())
                {
                    if (myXMLReader.Name == "photo")
                    {
                        double tempPrice = 0.0;
                        double.TryParse(myXMLReader.GetAttribute("price"), out tempPrice);
                        returnValue.Add(new Item(
                            myXMLReader.GetAttribute("info"),
                            tempPrice,
                            ImagesRootFolder + myXMLReader.GetAttribute("image"),
                            myXMLReader.GetAttribute("sku")
                            ));
                    }
                }
            }
        }
        catch { }
        //Done
        ItemList = returnValue;
        IsReadingXML = false;
    }
}