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) 


本文标签: 添加 文档 元素 查询