Sedgwickz
http://tmango.com
我们在做第三方应用开发时经常会用到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这个集合,操作起来也会十分方便。
先介绍这些吧,以后有空再进行深入介绍。
下面是示例的Demo:
posted on 2011-06-28 11:01  Sedgwickz  阅读(2823)  评论(7编辑  收藏  举报