Silverlight读取XML代码(非常有用^-^)

来源:互联网 发布:json转数组 编辑:程序博客网 时间:2024/06/11 00:37

Reading XML with Silverlight

时间:2009-12-23 10:04来源:SilverlightChina.Net 作者:银光中国网 点击:369次
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. Lets say, for example, you want to store a tree structure of
  

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:

<?xml version="1.0" encoding="utf-8" ?>
<ImageTree>
  <Area name="grass">
    <Image name="Normal Grass">grass1.png</Image>
    <Image name="Dry Grass">grass2.png</Image>
    <Image name="Mixed Grass">grass3.png</Image>
    <Image name="Long Grass">grass4.png</Image>
  </Area>
  <Area name="tile">
    <Image name="Brick">brick.png</Image>
    <Image name="White Stone">stone.png</Image>
    <Image name="Cracked Stone">crackedstone.png</Image>
    <Image name="Black Brick">brick2.png</Image>
  </Area>
</ImageTree>

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.
    }
}

The result of the code above is a tree view with all the items added as seen in the image below.

效果图

On a final note, this code is hard wired to read a specifically formatted and error free file. You will want to add error checking in case the file is invalid in anyway.