前一阵子试着写个SilverLight应用,其中需要读取xml作为数据文件,但是由于xml里的数据随时都需要外部更改,于是乎不方便放在xap里,免得违背了"一次OX,处处运行"这种某伪OO语言所兴起的风潮,直接放在ClientBin下,于是开了各种尝试.
首先,很自然,看了msdn,直接选用XmlReader.Create(string uri)来创建reader,可惜...杯具,这里的uri是直接指向xap下的.(M$,你敢给个XmlReader.Create(URI uri)的overload么)
说到URI,SL里如果相对地址为"Image/1.jpg",先查看是否在ClientBin/Image下有1.jpg.然后再在xap下找,而如果"~Image/1.jpg",那就直接找xap下是否有...
然后.各种找攻略,期间发现各种水文(国内各种论坛果然是鱼龙混杂,虽卧虎藏龙,但是还是有神一般存在的家伙的-_-,ps:咱是水货),包括使用XmlDocument的杯具男,我说你们写上去之前能跑一下代码,或者好好看以下msdn吗,上面清楚写着,XmlDocument不可用阿....
好吧,SilverLight对WPF的瘦身不是一点,茫茫多的功能被阉割掉了,原本很强大的xml支持,现在只剩那么几个鸡肋一般的了.害咱解析的类写了好久T_T
SL酱小一点真的好么?一只手握住刚好,还是贫R是稀缺资源呢?M$不能这么邪恶啊...
进入正题...水了好久啊...
这边提供这么个类 XMLParse:
from http://forums.silverlight.net/forums/t/99312.aspx
public class XMLParser
{
public delegate void EventHandler(object sender, XmlParserEventArgs e);
public event EventHandler Completed;
public void LoadXMLFile(string xmlURI)
{
WebClient xmlClient = new WebClient();
xmlClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(XMLFileLoaded);
xmlClient.DownloadStringAsync(new Uri(xmlURI, UriKind.RelativeOrAbsolute));
}
void XMLFileLoaded(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
string xmlData = e.Result;
if (Completed != null)
{
Completed(this, new XmlParserEventArgs(xmlData));
}
}
}
}
public class XmlParserEventArgs : EventArgs
{
public string XmlString { get; set; }
public XmlParserEventArgs(string xmlString)
{
this.XmlString = xmlString;
}
}
用WebClient+异步传输,貌似可以获取其它网站的数据,很不错的方法.虽然还有修改的方法,嘛,有空再看了.使用范式就在那个link里找吧...
=========================人,人家才不是什么分割线呢=============================
【reprinted from http://hi.baidu.com/avalontm/blog/item/bae82d3cbbe006cd9e3d6279.html】