我们在做第三方应用开发时经常会用到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: