博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Reading XML with Silverlight
阅读量:4134 次
发布时间:2019-05-25

本文共 4428 字,大约阅读时间需要 14 分钟。

XML (Extensible Markup Language) is a great format for saving structured data in. In this Tip I will be showing you how to read and process XML files from Silverlight using the XmlReader object.

Let’s say, for example, you want to store a tree structure of images grouping by them category. Your XML could look like this:

grass1.png
grass2.png
grass3.png
grass4.png
 
brick.png
stone.png
crackedstone.png
brick2.png
 
 

Few things to note about the XML above:

  1. XML can only have one root node which in my case I have called <ImageTree>
  2. <Area> and <Image> tags are called Elements
  3. “name” is an attribute and its content is the value for the attribute.

Now, on to the code below:

  1. To open an XML file I will be using the WebClient object. I have placed a file called MapImages.xml in my ClientBin folder that contains the data I will read. When the file read operation is complete (remember everything is asynchronous) the callback function client_DownloadStringCompleted will be called.
  2. When reading the data I check to see what the NodeType is. I only care about nodes that are of type Element or Text and I ignore stuff like comments, whitespace, etc.
  3. Once you read an Element you can get the attribute (such as name=”Brick”) for the Element by calling reader.MoveToFirstAttribute().
  4. The file name for each image is stored in the Tag property of each tree view item.
public Page()
{
InitializeComponent();
 
Uri url = new Uri("MapImages.xml", UriKind.Relative);
WebClient client = new WebClient();
client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(client_DownloadStringCompleted);
client.DownloadStringAsync(url);
}
 
void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
if (e.Error == null)
{
TreeViewItem areaItem = null;
TreeView tv = new TreeView();
TreeViewItem rootItem = new TreeViewItem();
rootItem.Header = "Images";
tv.Items.Add(rootItem);
 
 
StringReader stream = new StringReader(e.Result);
XmlReader reader = XmlReader.Create(stream);
string imageName = String.Empty;
string areaName = String.Empty;
string fileName = String.Empty;
 
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element)
{
if (reader.Name == "Area")
{
if (true == reader.MoveToFirstAttribute())
{
areaName = reader.Value;
areaItem = new TreeViewItem();
areaItem.Header = areaName;
rootItem.Items.Add(areaItem);
}
}
else if (reader.Name == "Image")
{
if (true == reader.MoveToFirstAttribute())
{
imageName = reader.Value;
}
}
}
else if (reader.NodeType == XmlNodeType.Text)
{
fileName = reader.Value;
TreeViewItem imageItem = new TreeViewItem();
imageItem.Header = imageName;
imageItem.Tag = fileName;
if (null != areaItem)
areaItem.Items.Add(imageItem);
}
}
MainCanvas.Children.Add(tv); // Add the treeview to our main canvas.
}
}

To use LINQ you will need to add a reference to System.Xml.Linq. To do this, right click on your References folder in your Silverlight application in the Solution Explorer and choose “Add Reference”. You will find this component on the .NET tab. In your source file add a using statement to reference System.Xml.Linq.

The function below will create a tree view out of the XML file that is shown above. A few important notes on this code:

  1. The XML file will need to be marked as Build Action=Content so that it gets placed into your XAP file. If you select this file, you can apply this setting in it’s properties in the property grid.
  2. XDocument.Load() is used to load the XML file from your XAP.
  3. The XDocument has a enumerable property called Descendants. You can specify what node you want to search for as the parameter of this property and go from there.
private void CreateTree()
{
TreeViewItem areaItem = null;
TreeView tv = new TreeView();
TreeViewItem rootItem = new TreeViewItem();
rootItem.Header = "Images";
tv.Items.Add(rootItem);
 
XDocument document = XDocument.Load("MapImages.xml");
 
foreach (XElement element in document.Descendants("Area"))
{
areaItem = new TreeViewItem();
areaItem.Header = element.FirstAttribute.Value;
rootItem.Items.Add(areaItem);
 
foreach (XElement imageElement in element.Descendants("Image"))
{
TreeViewItem imageItem = new TreeViewItem();
imageItem.Tag = imageElement.Value;
imageItem.Header = imageElement.FirstAttribute.Value;
areaItem.Items.Add(imageItem);
}
}
 
MainCanvas.Children.Add(tv);
}
As you can see from the code above it’s a lot simpler and straight forward than using
XmlReader

转载地址:http://lvpvi.baihongyu.com/

你可能感兴趣的文章
Linux中对逻辑卷进行扩容与缩小
查看>>
在hadoop调用mapreduce对文件中各个单词出现次数进行统计
查看>>
RDD编程初级实践
查看>>
每日一题 错选择 及 编程题 周总结(五)
查看>>
举例详解 java.util.concurrent 并发包 4 种常见类
查看>>
Web在线聊天室(完结) --- 注册用户+ip地址
查看>>
求正数数组的最小不可组成和 --- 背包问题(动态规划)
查看>>
思维导图模式 -- 深度理解及复习 数据库 知识
查看>>
思维导图模式 -- 深度理解及复习 JavaWeb 知识
查看>>
初识Spring(IOC,DI,创建流程)
查看>>
初识Spring Framework——Bean、注册Bean、依赖注入
查看>>
思维导图模式 -- 深度理解及复习 网络 知识
查看>>
SpringBoot使用Redis做缓存,RedisUtil
查看>>
为什么你们这么喜欢在for循环里面增删改查!
查看>>
JAVA -敏感词过滤器 工具类SensitiveFilter
查看>>
JAVA 订单号生成类
查看>>
JAVA - 根据用户自增ID生成邀请码的工具类
查看>>
VUE中父子页面传值,子页面调用父页面方法
查看>>
Element-ui Cascader 级联选择器回显数据
查看>>
js字符串数组转数字数组及map方法函数的用法
查看>>