读取XML文件在Xamarin
本文关键字:Xamarin 文件 XML 读取 | 更新日期: 2023-09-27 18:07:54
我是Xamarin的新手,我希望在可移植类库中读取XML文件。
文件可以嵌入或在线,我已经做了一些研究,并找到了两者的选项,但我发现的一切都过于复杂,这样一个简单的任务。我想知道是否有人有一个简单,干净的方法来完成这个。
唯一的规定是你使用可移植类库,以便iOS, Android和Windows Phone项目都可以使用相同的方法。
背景:基本上,我正在构建一个将放置在ListViewer中的项目列表。每个Item都有一个Name字符串和一个ImageSource字符串。我有包含我想要使用的信息的xml文档,我只需要一种在Xamarin中读取这些xml文件的简单方法。
感谢您提供的任何帮助!
PCL无法访问System.IO。
我相信解决问题的一种方法是在PCL中添加xml文件作为资源,在FileStream
对象中加载文件并使用StreamReader读取它,看看这篇文章
虽然我建议你将文件转换为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;
}
}