admin 管理员组文章数量: 1086019
2024年4月20日发(作者:打印二维数组java)
……
NETWORK&C0啊啊UNIC盯ION……………………………………………………………………………………
。 叠薯 薹 誊
一步步警■
_利
●● (
÷
。
j j
Qto x M ̄ :
摘 要:传统模式(DOM)下操纵XML文档需要编写大量代码。利用LINQ to XML可以大大
简化对XML文档的操作,充分利用LINQ查询,快速地完成操纵XML文档进行查询、添加、
删除、及修改操作。
关键词:LINQ tO XML;操纵XML文档;实例
上一讲讲述了LINQ to XML的基础知识,以下结合具体实
例详尽讲解如何通过LINQ to XML操纵XML文档。
操纵XML文档主要指对XML文档进行查询、添加、删除
及修改的操作。增删改的操作有针对XML文档内容的,即对
于元素及属性的值进行相关操作;也有针对XML文档本身结
构的.即对于元素及属性本身进行相关操作。这里的增删改是
针对XML文档内容的。传统模式(DOM)下操纵XML文档需
要编写大量代码.而通过LINQ to XML可以降低操纵XML文
档的难度即充分利用LINQ查询,进而大大提高了操纵XML
文档的效率。
1 查询
查询是操纵XML文档最主要的工作。删除、修改离不开
查询:LINQ to XML还允许将查询结果插入到XML文档中,
所以某种程度上添加操作也离不开查询。
查询XML文档的基本要点如下:
先将XML文档读入内存,同时生成一个Xelement实例,
即XML树。代码如下:
XElement root=XElement.Load(Server.MapPath("Stu-
dents.xml ))=
然后对此XML树根据不同的条件进行相应的LINQ查询,
代码如下:
var results=frOm xe in root.Descendants(“student“)
where(string)xe.Attribute( sno )==TextBoxSno.Text
select xe;
最后判断有无满足条件的元素,若有将查询结果输出,代
码如下:
foreach(XElement el in results)
\
LabelResults.Text+=(string)el+ 《br/> :
1.1 界面设计
在网站根目录下添加一个名为“Select.aspx”的Web窗
体。打开其设计视图添加相关控件,如图l所示。
图1 “Select.aspx”设计视图
其中:
性别通过两个RadioButton选取其一.设其GroupName=”
sex”
。
LabelResuhs控件用以显示查询结果。
1.2添加按钮代码事件
(1)双击“按属性学号查询”按钮,添加如下代码:
protected void Button1~CIick(object sender,EventArgs e)
{
-
XElement root=XElement.Load(Server.MapPath(“S
dents。xmn)
var results=f Om xe in}root.Descendants( student }
where (string)xe.Attribute (”sno ) ==
TextB0xSno.Text
select xe;
if(resuIts.Count()==1)/,存在该学号
,
LabelResutts.Text= ,/清空结果标签
foreach(XElement el in results1
{
LabelResu}t s_Text+=(string)el+ <br/>“
)
)
嘏||i螭
…………………………………………………………
实用第一 智慧密集
… …………………………… …… …………………
else//学号不存在
{
foreach(XElement.el…in results)
{
Response.Write(“<script>alert ̄ 该学号不存在l );</
LabelResults.Text+=(string)eI 4- <br/>”:
script>”):
LabelResults.Text= :∥清空结果标签
}
)
(2)双击“按元素姓名查询”按钮,添加如下代码:
protected void Button2
Click(object sender EventArgs e)
{
XElement root=XElement.Load(Server.MapPath("Stu—
dents.xml”)):
var results=from xe in root.Descendants(”name“)
where string)xe.Value==TextBoxName.Text
select xe.Parent:∥找到其父元素,即student元素
if(results.Count()>0)// ̄在该姓名
{
LabelResults.Text=“”:∥清空结果标签
foreach(XElement el in results)
{
LabeIResults.Text+=(string)el 4-“<br/>l
)
}
else//姓名不存在
{
Response.Write(”<script>alert(k'‘该姓名不存在l\II) </
script>”):
LabeIResults.Text= “;//清空结果标签
}
)
这段代码与“按学号查询”的代码基本相同。不同之处在
于因为姓名可能相同,也就是说可能查到多个元素,此外姓名
name是元素,而学号sno是属性。
(3)双击“按元素性别查询”按钮,添加如下代码:
3Irotected void Button3
Click(object sender,EventArgs e)
(
string SelectSex;//该变量存放选取的性别sex的值。
|f(RadioButtonMale.Checked)
SelectSex=”男
else
SelectSex=”女“
XElement root=XElement.Load(Server.MapPath(“Stu—
dents.xmt”));
var results=from xe in root.Descendants(‘ ̄sex,’
where(string)xe Value==SeIectSex
select xe.Parent;f ̄rJ其父元素,即student元素
if(results.Count()>0)//#在该性别
{
LabelResults.Text=…‘:∥清空结果标签
20
11.
07
毫墙
镰褪技
巧与赡
《i
)
)
else,/f生别不存在
(
R1esponse.Write(’'<script>alert(V ̄性别不存在 );</script>'‘):
Label Results.Text=… :,/清空结果标签
)
)
这段代码与“按学号查询”的代码基本相同。不同之处在
于因为性别可能相同,也就是说可能查到多个元素,此外性别
sex是元素,而学号sno是属性。性别不是输入的,而是采用
单选按钮选取的。
(4)双击“按属性出生年份查询”按钮,添加如下代码:
Protected void Button4
_
Click(object sender,EventArgs e)
{
XEtement root:XElement Load(Server.Ma pPath("Stu-
dents.xm );
var resuIts=frOm xe in root.Descendants(”age )
where(string)xe,Attribute( BirthdayYea =
TextBoxYear.Text
select xe.Parent;/l ̄EJ其父元素,即student元素
(results.Count{)>O)N存在该出生年份
{
LabelResuIts.Text=。”;//清空结果标签
foreach(×Element el in resuits)
{
LabelResuIts.Text+=(string)el 4- <br/>“
}
)
else∥出生年份不存在
(
Response.Write( <scr_plt>alert{\¨该出生年份不存在f
。):</Script> )
LabelResults Text= ‘://清空结果标签
}
)
这段代码与“按学号查询”的代码基本相同。不同之处在
于因为出生年份可能相同,也就是说可能查到多个元素。
2 添加
添加XML文档的基本要点如下:
先将XML文档读人内存,同时生成一个Xelement实例,
即XML树,代码如下:
XElement root=XElement.Load(Server.MaPPath(HStu-
dents.Xm )):
然后生成一个新元素,并将各文本框的内容赋给元素或属
……
哪删ORK&C0啊啊UNIC盯ION…………………………………………………………………………………
int age=year—jnt.Parse(TextBoxYear。Text); 性.主要代码如下:
XElement NewStudent=new XElement(,student'。,....…);
/,根据出生日期计算年龄
×EIement NewStudent=new XElement( student“,
new XAttribute(usno TextBoxSno Text)
new XEIement(’,name",Texl:BoxName。Text),
new XEIement(“sex”,Ssex),
接着将此新元素加人XML文档树(内存中),代码如下:
root:Add(NewStudent);
最后将内存中的XML树保存在磁盘上的XML文档中,代
码如下:
root.Save(Server.MapPath(“Students.xml ))=
2.1 界面
在网站根目录下添加一个名为“Inse ̄.aspx”的Web窗体。
打开其设计视图添加相关控件,如图2所示。
图2 “Insert.aspx”设计视图
其中:
性别通过两个RadioButton选取其一.设其GroupName=”
S@X”;因为年龄可以通过出生年份计算出来,所以不用输入
年龄。
2.2添加按钮代码事件
双击“提交”按钮,添加如下代码:
protected void Button1
一
Click(object sender Even ̄rgs e)
(
XElement root=XElement.Load(Server.MapPath("Stu-
dents.xmn):
If ̄)JrJ元素前,先查询学号是否存在。
var results=fr0m xe in root.DesGendants《“stUden ̄)
where (string)xe。Attribute ( sno,) ==
Te×tBOxSnO.丁ext
select xe;
if(results.Count() =O)lf ̄不存在,可以添加。
string Ssex;// ̄放选取的性别的值。
|f(Rad oButtonMale。Checked)
Ssex=“男”:
eIse
Ssex=
int year=DateTime.Now.Year;//系统19期取年份
new XElement( age age.ToString0,
new XAttribute(”BirthdayYear”,TextBoxYear.Text)),
new XElement(‘'score ,
r1ew XElement(,Chinese ,TextBOXChinese.Text),
new XEtement(“Match”.TextBoxMatch.Text))
//将新元素加入XML文档树(内存中)
root。Add(NewStudent);
//f呆存到xmi文档
root;Save(Server.MapPath( Students.xml“)):
Response.Write(“<sc—pt>aIert( 已成功添加记录!
</scri.3t>“):
、
else//学号存在,不能添加。
Response:Write(,<script>atert(k'’该学号已存在。学号
不能相同!\lI);</script>”):
)
注意:添加记录时,应先查询学号是否存在(代码与前面
相同),若不存在才能添加。
3 删除
删除XML文档的基本要点如下:
先将XML文档读入内存。同时生成一个Xelement实例,
即XML树,代码如下:
XElement root=XElement。Load(Server.MapPath《“Stu-
dents.xm
然后对此XML树根据不同的删除条件进行相应的LINQ查
询,代码如下:
var resu}ts=from xe in root.Descendants(”student“)
where(string)xe.Attribute(”sno”)==TextBoxSno.Text
select xe:
接着判断有无满足删除条件的元素。若有将这些元素移除
XML树,代码如下:
results.Remove():
最后将内存中的XML树保存在磁盘上的XML文档中,代
码如下:
root.Save(Server.MapPath( Students.xml“JJ:
3.1 界面
在网站根目录下添加一个名为“Delete.aspx”的Web窗
体。打开其设计视图添加相关控件,如图3所示。
其中:
性别通过两个RadioButton选取其一,设其GroupName
…………………………………………………… …一
实用第一 智慧密集
… ………………… ………………… ……………
=
l1 sexlI
。
dents.xm )
LabelResuhs控件用以显示删除结果,提示有几个元素被
删除了。
∥删除前要查询该姓名是否存在
var results=from xe in root.Descendants("name")
where
Text
学号SIlO和出生年份BirthdayYear是属性,姓名Dame和性
别sex是元素。此页面可实现对特定元素和特定属性的删除。
(st『ing)xe.VaIue;;TextBoxName.
select xe.Parent;//找到其父元素,即student
∥元素
if I[results.Count()>0)//#在该姓名
{
int delNUms=results.Count0:
results.Remove():删除满足条件的元素
//保存到xmI文档
root.Save(Server.MapPath《 Students.xml )):
∥在标签中显示删除的元素个数
LabelResults.Text=I’已成功删除 +delNums+ 元
素 :
图3 “Delete.aspx”设计视图
{
)
else//@名不存在
Response.Write(”<script>alert( 该姓名不存在!
script>
j
3_2添加按钮代码事件
(1)双击“按学号删除”按钮,添加如下代码:
protected void Button1
Click fobject sender,EYentArgs
一
</
这段代码与“按学号删除”的代码基本相同。不同之处在
于因为姓名可能相同,也就是说可能查到多个元素。所以通过
e)
{
XElement root=XElement.Load(Server.MapPath("Stu
dents.xml”)):
var results=from xe in root。Descendants("student")
where
TextBoxNo Text
。LabelResuhs控件显示有几个元素被删除了。
(3)双击“按性别删除”按钮,添加如下代码:
protected void Button3
_
CIick(object sender.EventArgs e)
(string)xe.Attribute ( snO”) ={
{
。。 。string SeIelctSe×∥该变量存放选取的性别sex的值。
lf(RadioButtonMale.Checked)
select xeI//删除前要查询该学号是否存在
if《results.Count()==1)腑在该学号。
{
SelectSex= 男”
else
results.Remove();//删除满足条件的元素
//保存到xml文档
root.Save(Server.MapPath(“Students.xmr":
SelectSex=”女
XE}ement root=XElement.Load(Server.MapPath(“Stu-
dents XmI )):
Response.Write(”<scr;pt>a{ert(\ 以成功删除该元素f
\Ⅱ):</script>。):
)
eIse∥学号不存在
{
//删除前要查询该性别是否存在
var results=fr0m xe in root.Descendants("sex”)
where(string)xe,Value==SelectSex
select xe.Parent 找到其父元素,即student
朊素
Response.Write( <script>alert(k'‘该学号不存在l\1.);</
(res ults.Count()>O)Ht:在该性别
{
int deINums= esults.Count()
script>,‘):
)
)
一
resuIts.Remove()://删除满足条件的元素
f{果存到xml文档
root.Save(Server.MapPath('。Students.xmI”})
注意:删除前先要查询是否有满足条件的记录.这部分内
容与前面的查询代码一致。
(2)双击“按姓名删除”按钮,添/JU ̄H下代码:
protected void Button2
Click(object sender,Even ̄rgs
一
一
素!U
,在标签中显示删除的元素个数
LabeIResults.Text=”已成功删除 +deINUms+ 元
)
e)
else//性别不存在
XElement root=XElement.Load(Server.MapPath《!tStu一
{
07
技巧 与
Response.Write( <script>alert(k' 该性别不存在Il );</
script>");
个子元素或属性的值显示在相应的文本框中,以待用户修改,
代码如下:
foreach(XElement el in resuIts,
)
}
{
这段代码与“按学号删除”的代码基本相同。不同之处在
于因为性别可以相同,也就是说可能查到多个元素.所以通过
ll l■ TextBoxNolText=e1.Attribute fHsno ).Value:
70St[ing 0
LabelResuhs控件显示有几个元素被删除了。此外性别不是输
入的.而是采用单选按钮选取的。
(4)双击“按出生年份删除”按钮,添加如下代码:
protected void Button4_Click(object sender,EventArgs e)l
{
0 XElement root=XElement.Load(Sen,er.MapPath("Stu-
dents.×m㈨
删除前要查询该出生年份是否存在
var results=from xe in root.Descendants("age”)
where(string)xe,Attribute(”Bj dayYear')==
下e×tBoxYear.Text
select xe.Parent;//找到其父元素,即student元素
if(results.Count()>0)//存在该出生年份
{
int delNums:results.Count():
resUIts.Remove()∥删除满足条件的元素 。。
,/保存到xml文档
root.Save(Sewer MapPath( Students.xmI”
LabelResults.Text=”已成功删除 +delNums “元
素} ∥在标签中显示删除的元素个数 -
)
else//出生年份不存在 l l
{
Response.Write(“<script>alert(k"该出生年份不存在!
):</script>”):
)
这段代码与“按学号删除”的代码基本相同。不同之处在
于因为出生年份可以相同,也就是说可能查到多个元素,所以
通过LabelResults控件显示有几个元素被删除了。
4修改
修改XML文档的基本要点如下:
先将XML文档读人内存,同时生成一个Xelement实例。
即XML树,代码如下:
XEtement root=XElement.Load(Server.MapPath《”Stu_
dentsixml“))
然后对此XML树根据修改条件进行相应的LINQ查询.
代码如下:
var results=fr0m xe in root.Descendants("student
where(string)xe.Attribute(“sno“)==TextBoxSnO.1 ×t
select xe;
接着判断有无满足删除条件的元素,若有,先将元素的各
|TeXtBo ̄Nam8 xt=e1.Element r'name,LValue.
ToString() =
)
接下来,用文本框的值更新待修改元素的各个子元素或属
性的值,代码如下:
foreach《×EIlement eI in results)
0 l l
eI.Etement("name").Value=TextBoxName.Text;
| eLE,8储ent("sex").Value=TextBoxSex:Text;
最后将内存中的XML树保存在磁盘上的XML文档中。代
码如下:
root:Save(ServeLMalPPath( Students:xml。)):
4.1 界面
在网站根目录下添加一个名为“Update.aspx”的Web窗
体。打开其设计视图添加相关控件,如图4所示。
其中:
性别通过两个RadioButton选取其一,设其GroupName=”
sex”
n
图4 “Update.aspx”设计视图
因为只能修改学号以外的信息,所以用以显示学号的文本
框设置成只读的。
4.2添加按钮代码事件
共有两个命令按钮,其中“显示详细信息”按钮的功能是
显示待修改元素的详细信息,以便用户进一步修改: “提交”
按钮的功能是完成修改。
(1)双击“显示详细信息”按钮,添加如下代码:
pforected Void Button1
一
C ck(object sender,EventArgs e)
…………………………………………………………
实用第一 智慧密集
………… … ………… …… ……… …………………
{
XElement root=XElement.Load(Server.MapPath( Stu—
dents.xml”)):
var results=from xe in root.Descendants(”student,)
where (string)xe.Attribute (”sn )==
TextBox1.Text
select xe: 改前要查询该学号是否存在
/IF在该学号,将该元素的各个子元素或属性的值显示在相应的
//文本框中。
if(results.Count():=1)
{
foreach(XElement el in results)
f
TextBoxNo.Text = e1.Attribute(Ilsno,)Nalue.
ToString():
TextBoxName.Text=e1.Element( name”}_Value.
ToString():
TextBoxSex.Text=e1.Element (“sex'。).VaIue.
ToString
TextBoxYear.Text=e1.Element("age“).Attribute(“
8lnhdayYear”).Value.ToString0;
TextBoxChinese.Text=e1.Element f,score',).El争
ment( Chinese“).Value.ToString0;
TextBoxMatch.Text=e1.Element(',score”).Ele,
ment( Match,Value.ToString0;
)
)
else//学号不存在
(
Response.Write(“<script>alert(k'。该学号不存在!\H):</
script>“):
)
)
注意:修改元素时,应先查询输入的学号是否存在,若存
在.在文本框中显示其详细信息,让用户判断是否需要修改
(只能修改学号以外的信息)。查询部分代码与前面的一样。
(2)双击“提交”按钮,添加如下代码:
protected void Button2
一
Click(object sender,EventArgs e)
{
if(RadioButtonMale.Checked)//根据用户选择的性另lJ’给
//相应文本框赋值。
TextBoxSex.Text=”男”:
else
TextBoxSex.Text= 女”:
int year=DateTime.Now.Year;//, ̄统日期取年份
int age=year—int.Parse(TextBoxYear.Text);// ̄,m生
//13期计算年龄
,/用文本框的值更新student元素的各个子元素或属性的
}憾
XEIement root=XElement.Load(Server.MapPath(,Stu-
≮羹 技巧 07
dents。×m㈨Il
var results=from xe in root.Descendants(“student'‘)
where(string)xe.Attribute (”sno“) ==
TextBox1.Text
select xe;
toreach(XElement el in results)
{
e Element( name”)。Value=TextBoxName.Text;
e1.Element(‘!sex ).VaIue=Te×tBoxSex.Text;
el。Element("age“).Attribute( BirthdayYea .Value=
TextBoxYear.Text;
el:Element(’'age”).Value=age.ToString()://用计算出
//的年龄给age元素赋值。
el_曰ement{“score,。).Element{¨Chinese“):Value=
TextBoxChinese.Text:
eLElement("score”J.Element (”Match l_Value=
TextBoxMatch:Text
)
//1呆存到xmf文档
root.Save(Server:MapPath(“Students.xml“)):
Response:write《 <script>alert 已成功修改 \l‘);</
script>,
)
这部分代码完成修改,并将修改结果保存到磁盘上的
XML文档。
5 结语
至此.已经完成了利用LINQ to XML对XML文档的基本
操作,其关键是LINQ查询。正是LINQ to XML与LINQ的集
成,大大降低了操作XML文档的复杂度,大幅度提高了工作
效率。
(收稿日期:2011-01—15)
版权声明:本文标题:一步步学LINQ to XML(二)——利用LINQ to XML操纵XML文档 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1713544551a640022.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论