Windows Phone 7中关于XML文件的读取,过滤,绑定的几种方法

来源:互联网 时间:1970-01-01

我们在做第三方应用开发时经常会用到Linq来定向的解析查询所得到的XML文件,本文是自己在做WP7第三方新浪微博客户端,人人网客户端时所采用的几种方法,希望对大家有所帮助,废话少说,上正文。

首先看以下两个XML文件:

Students.xml

<?xml version="1.0" encoding="utf-8" ?>

<Student>

  <user>  <headurl>http://tp3.sinaimg.cn/1948192014/50/5601371558/1</headurl>
    <name>张小三</name>
    <age>20</age>
  </user>
  <user>
    <headurl>http://tp3.sinaimg.cn/1948192014/50/5601371558/1</headurl>
    <name>李小四</name>
    <age>18</age>
  </user>
  <user>
    <headurl>http://tp3.sinaimg.cn/1948192014/50/5601371558/1</headurl>
    <name>王小五</name>
    <age>22</age>
  </user>
  <user>
    <headurl>http://tp3.sinaimg.cn/1948192014/50/5601371558/1</headurl>
    <name>马小六</name>
    <age>20</age>
  </user>
</Student>

 

StudentInfo.xml

<?xml version="1.0" encoding="utf-8" ?>
<Student>
  <user
    headurl="http://tp3.sinaimg.cn/1948192014/50/5601371558/1"
    name="张小三"
    age="20"/>
  <user
   headurl="http://tp3.sinaimg.cn/1948192014/50/5601371558/1"
   name="李小四"
   age="18"/>
  <user
   headurl="http://tp3.sinaimg.cn/1948192014/50/5601371558/1"
   name="王小五"
   age="22"/>
  <user
   headurl="http://tp3.sinaimg.cn/1948192014/50/5601371558/1"
   name="马小六"
   age="20"/>
  <user
   headurl="http://tp3.sinaimg.cn/1948192014/50/5601371558/1"
   name="贾小可"
   age="22"/>
  
</Student>

 

下面创建一个Model类,来对数据进行存取。

public class Model  

   {  

       string headurl="";  

       string nameurl="";  

       int age;  

  

       public string HeadUrl { get; set; }  

       public string Name { get; set; }  

       public int Age { get; set; }  

   } 

 

这是前台代码,主要是控件的摆放和绑定操作:

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <ListBox HorizontalAlignment="Left" Margin="12,6,0,18" 
Name="listBox1" Width="342" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding HeadUrl}" 
Width="50" Height="50"/>
                            <StackPanel>
                                <TextBlock Text="{Binding Name}"/>
                                <TextBlock Text="{Binding Age}"/>
                            </StackPanel>
                            
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <ListBox Height="295" HorizontalAlignment="Left" 
Margin="360,6,0,0" Name="listBox2" VerticalAlignment="Top" Width="338">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Source="{Binding HeadUrl}" 
Width="50" Height="50"/>
                            <StackPanel>
                                <TextBlock Text="{Binding Name}"/>
                                <TextBlock Text="{Binding Age}"/>
                            </StackPanel>

                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        </Grid>

 

为了读取XML文件中的信息,我们需要添加一个.Net库支持 System.Xml.Linq.我们会使用到里面的XDocument相关类的操作。

 

接下来我们进行查询及绑定,直接看代码吧:

XDocument xdoc = XDocument.Load("Students.xml");  

           var student = from query in xdoc.Descendants("user")  

                         select new Model  

                         {  

                             HeadUrl = (string)query.Element("headurl"),  

                             Name = (string)query.Element("name"),  

                             Age=(int)query.Element("age")  

                         };  

           this.listBox1.ItemsSource = student; 

 

效果如下图:

 

要进行数据的过滤操作,需要对各个元素的属性值进行判断,我们使用下面那个StudentsInfo文件进行判断,当然用Students也可以,这里就不多说了。继续看代码:

XDocument xdoc1 = XDocument.Load("StudentsInfo.xml");  

            var student1 = from query in xdoc1.Descendants("user")  

                           where query.Attribute("age").Value == "20" 

                          select new Model  

                          {  

                              HeadUrl = query.Attribute("headurl").Value,  

                              Name = query.Attribute("name").Value,  

                              Age =int.Parse(query.Attribute("age").Value)  

                          };  

            this.listBox2.ItemsSource = student1; 

 

为了醒目我将上面两个例子放在一起显示,如图:

 

下面是一个按某个元素来进行排序的例子,我们就按年龄来对刚才的数据进行一个升序排列:

XDocument xdoc1 = XDocument.Load("StudentsInfo.xml");  

            var student1 = from query in xdoc1.Descendants("user")  

                           orderby int.Parse(query.Attribute("age").Value) ascending  

                          select new Model  

                          {  

                              HeadUrl = query.Attribute("headurl").Value,  

                              Name = query.Attribute("name").Value,  

                              Age =int.Parse(query.Attribute("age").Value)  

                          };  

            this.listBox2.ItemsSource = student1; 

 

注意:按降序排列的话就把ascending改成descending可以了,默认是按升序排列的。

看图:

 

下面再介绍另一种查找方法,感觉也非常实用:

public ObservableCollection<Model> studentCollection { get; private set; }  

  

XDocument xdoc2 = XDocument.Load("Students.xml");  

           studentCollection = new ObservableCollection<Model>();  

           foreach (XElement element in xdoc2.Element("Student").Descendants("user"))  

           {  

               studentCollection.Add(new Model()  

                {  

                    HeadUrl = element.Element("headurl").Value,  

                    Name = element.Element("name").Value,  

                    Age =Int32.Parse(element.Element("age").Value)  

                });  

           }  

           this.listBox1.ItemsSource = studentCollection; 

效果如下:

 

要进行数据的筛选等操作只需要在foreach里面进行判断就可以了,也是很方便的。而且使用了ObservableCollection这个集合,操作起来也会十分方便。

先介绍这些吧,以后有空再进行深入介绍。

源码下载

本文来自石霖的博客,原文地址:http://www.cnblogs.com/ezra/archive/2011/06/28/2092033.html


相关阅读:
Top