我们在做第三方应用开发时经常会用到Linq来定向的解析查询所得到的XML文件,本文是自己在做WP7第三方新浪微博客户端,人人网客户端时所采用的几种方法,希望对大家有所帮助,废话少说,上正文。
首先看以下两个XML文件:
Students.xml
StudentInfo.xml
下面创建一个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
; }
}
|
这是前台代码,主要是控件的摆放和绑定操作:
为了读取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: