XML应用于处理
前言
所谓XML是以一种简单的文本格式存储数据,可以在不同系统间进行数据交换,这使它成为在Internet上传输数据的绝佳路径.
题目一:什么是XML
参考:所谓的XML就是一种用来存储数据的文本.操作XML的主要方式如下:
1.基于DOM的XML操作方式
2.非缓存的流式操作方式
3.使用LINQ操作XML的方式(LINQtoXML)
题目二:XML文档结构包括哪些
参考:只有掌握XML文档的结构,才能写出XML格式的文档,XML文件的而第一行显示XML的版本信息和编码格式,基本语法如下:
<?xmlversion=”1.0”standalone=”yes”>这句话必须是第一行.
接下来的内容是XML标记.首先要创建根元素,本次实例使用<Table>标记作为根元素(你可以使用任意标记),但是最好是选择一个有实际意义的单词.接下来咱们简单的写一点XML代码:
<?xml version=”1.0” standalone=”yes”> <Table> <StuId>1</StuId> <StuName>张三</StuName> <StuAddress>SDUT</StuAddress> <Age>22</Age> </Table>
这样的话,一段简单的XML文件就创建完毕了,从中发现了点东西,XML是一种自由形式的语言,允许自定义标记,而且每个标记都必须成对出现.
有一点注意:XML文件中的子元素里面还可以柚子元素,它允许嵌套任意深度的标记.
题目三:XML的优点有哪些呢?
参考:这个问题你稍微总结一些就应该能明白.因为XML是一种文本,所以在任何平台上都能读取和处理数据.还有一点是XML允许通过HTTP和其他传输协议交换XML数据.
因为XML是一种纯文本,所以XML很简单.能使用自定义标记,具有自我描述性.
题目四:XML的命名空间是什么?有什么作用?
参考:假设现在因为某些原因,在同一个XML文档中出现两组<name>元素.
<?xml version=”1.0” encoding=”utf-8”> <books> <book> <name></name> <author> <name></name> <sex><sex> </author> </book> </books>
出现上述情况之后,XML文档中的<name>元素就会产生冲突.所以这个时候就出现了命名空间,
<?xml version=”1.0” encoding=”utf-8”> <books> <book> <name></name> <author> <people:name></people:name> <people:sex></people:sex> </author> </book> </books>
XML的命名空间是用来统一命名XML文档中的元素和属性的一种机制.使用了命名空间的好处时,可以明确表示出XML文档中的元素,属性以及其他标记,可以避免名称之间的冲突.其本质就是在元素,属性名之前加上特定的命名空间.
说明:在XML文档中,一般使用URL来表示命名空间,但是一般的URL都比较长,放在元素和属性名称前难于书写,因此会使用一个简单的字符来代替,并称为命名空间前缀.
题目五:听说过XML中<![CDATA[]]>标签吗?
参考:前面楼主说过,XML的标签必须是成对出现的,而且不能嵌套程序.这样严谨的语法是的XML的读写变得很容易,但是也给一些特殊数据的存储带来了麻烦.假设某一本书的名称<MR>LIU,将该值添加到XML中时就会发生错误:
<?xml version=”1.0” encoding=”utf-8”?> <books> <book> <Title><MR>LIU</Title> <Author>张三</Author> </book> </books>
咱们知道<MR>LIU是一个书名,但是XML不知道啊,XML会将<MR>解析成一个没有结束标记的<MR>.这种情况下就出现了CDATA,强制的将<MR>LIU解析为一个书名:
<?xml version=”1.0” encoding=”utf-8”?> <books> <book> <Title><![CDATA[<MR>LIU]]></Title> <Author>张三</Author> </book> </books>
注意:![CDATA[和]]之间不能有空格,否则XML解析会出错.如果CDATA标签内的字符串带有]],XML解析器会将其当成CDATA标签的结束,从而使其后面的内容引发解析时的错误.
说白了,CDATA标签中的内容将会被XML解析器忽略,通常惠在其中存放大量带有<或>等特殊字符的数据内容.
题目六:加载XML文档
参考:首先介绍使用DOM操作XML,以DOM形式操作XML文件之前,必须将其加载到内存中.
protected void Page_Load(object sender,EventArgs e) { string path = Server.MapPath("Employee.xml");//获取XML文件的路径 FileStream fs = new FileStream(path,FileMode.Open);//创建文件流对象 XmlDocument xmlDoc = new XmlDocument();//创建XML文档对象 xmlDoc.Load(fs);//加载文件流 fs.Close();//关闭文件流 Response.Write(xmlDoc.InnerXml);//将XML文档对象中的内容输出到页面 }
总结:以DOM的方式加载一个XML文档,首先得创建一个XmlDocument的实例,然后调用其Load方法加载一个XML文档,XML文档可以来自本地或远程网络.
我详细介绍一下基于DOM的方式读写XML文档.不喜跳过
基于DOM的方式读写XML文档主要应用了XmlDocument类的Load方法和Sava方法:
1.Load方法,该方法从指定的流加载XML文档,上面已经说过了,该方法的语法是:publicvirtualvoidLoad(StreaminStream)
2.Save方法是将XML文档保存到指定的文件.语法如下:publicvirtualvoidSave(stringfileName),其中参数fileName是将文档保存到其中的文件的位置.
题目七:使用DOM操作XML文档
参考:直接先贴一段代码:
protected void Page_Load(object sender,EventArgs e) { XmlDocument xmlDoc = new XmlDocument(); xmlDoc.LoadXml("<所有图书><图书><书名>ASP.NET入门经典</书名></图书></所有图书>"); XmlElement root = xmlDoc.DocumentElement;//创建根元素 XmlElement book = xmlDoc.CreateElement("图书");//创建子元素 XmlElement name = xmlDoc.CreateElement("书名");//创建子元素 name.InnerText = "ASP.NET入门经典";//设置子元素的内容 book.AppendChild(name);//将子元素添加到父元素中 root.AppendChild(book); xmlDoc.Save(Server.MapPath("book.xml"));//保存XML文件 Response.Write(@"<script>location='book.xml';</script>");//页面定位到XML文件 }
这段代码没啥难点,就是使用XmlDocument类的CreateElement方法和XmlElement类的AppendChild方法实现添加节点操作.首先创建XmlDocument类型的实力对象xmlDoc,并将符合XML格式的字符串加载到xmlDoc对象中;其次以编程的方式创建XML元素,并添加到xmlDoc对象中;最后调用xmlDoc的Save方法保存XML文件.
题目八:操作XML文档的节点和属性
参考:本来楼主打算还是继续粘贴一段代码的,但是楼主发现这样的代码一点意思没有,全是一些设计好的小案例,没有意思的价值,无聊的时候打发时间是挺好,但是对项目以及日常生活没啥用处.所以楼主不打算贴代码了,等下次楼主碰到比较好的代码的时候才粘贴上来供大家参考.
题目九:使用XPath查找节点
参考:XPath其实是一门语言,一门专门在XML文档中查找信息的语言.知道sql吗,sql使用来干啥的?是用来操作数据库的,所以XPath是专门用来操作XML的,明白了吗?这就是XPath,关于XPath的具体内容,楼主不打算多说,主要是一句话两句话说不清楚,加上楼主也不是很明白,不管在这里班门弄斧,误导小朋友.
http://www.w3school.com.cn/xpath/index.asp
(这个网址也是用ASP.NET写的)
题目十:如何校验一个XML文档的格式
参考:使用ASP.NEt开发程序的时候,验证XML文档格式合法性的需求是家常便饭.要验证XML是否符合制定格式,前提是需要一个XML格式定义的文档,然后根据XML格式定义文档验证XML的合法性.你高中的时候做过5+3吗?你做广播体操的时候是不是也有个标准?要不然你怎么知道你做的好坏.对吧,一个道理.
使用XmlReader类读取XML文档时,可以通过XmlReaderSettings类指定XML格式定义文件,这样在读取的同时检查XML是否符合XSD中规定的格式.当验证出现错误或警告时,触发ValidationEvent事件.这里出现了一个新的名词XSD,XSD是指XML结构定义,它是描述XML结构的,用于验证XML的合法性,XML和XSD就好比数据库中的表数据和表结构的关系.
题目十一:如何实现XML文档和DataSet对象的转换
参考:前面说过DataSet是外部数据存储到内存中的数据容器;XML是一种以标签为基本元素的语言,主要用来承载数据,进行数据交互,说白了也是一种数据容器.既然都是数据容器,那么肯定存在着某种见不得人的关系,说白了就是同穿一条裤衩,可以相互转换.
实现DataSet和XML之间的转换主要应用了DataSet的ReadXml方法和WriteXml方法.
因为使用DOM操作XML是W3C的推荐标准,这里我不想多说一些了,等日后我会详细结果使用DOM操作XML的.
题目十二:如何入去流格式的XML
参考:在ASP.NET中操作XML文件非常灵活.通过XmlReader类可以以非缓存的流方式读取XML数据.首先创建XmlReader类的实力队形xr,其次在while循环中调用xr的Read方法(直到读取到XML文件的末尾),在读取的过程中判断XML节点的类型,根据节点的类型在页面中呈现出不同的内容.代码如下:
protected void Page_Load(object sender,EventArgs e) { using (XmlReader xr=XmlReader.Create(Server.MapPath("info.xml"))) { while (xr.Read())//循环读取XML中的内容 { switch (xr.NodeType)//根据节点乐行输出内容 { case XmlNodeType.Element://节点开始符号及其属性 Response.Write(Server.HtmlEncode("<" + xr.Name)); while (xr.MoveToNextAttribute()) { Response.Write(" " + xr.Name + "=" + xr.Value); } Response.Write(Server.HtmlEncode(">")); break; case XmlNodeType.Text: Response.Write(xr.Value); break; case XmlNodeType.EndElement: Response.Write(Server.HtmlEncode("</"+xr.Name+">")); break; default: break; } } } }
使用流操作XML并不常见,数以这里权当了解.楼主在这里就不多说了.
题目十三:使用LINQ操作XML
参考:这部分内容可能牵扯到前面说过的LINQtoXML.使用LINQ与之前提到过的两种方式相比,使用LINQ操作XML代码规范,精炼,简单,功能更加强大.代码如下:
protected void Page_Load(object sender,EventArgs e) { //设置XML文件存放的目录 string path = Server.MapPath("book.xml"); //使用LINQ创建XML文件的内容 XDocument doc = new XDocument( new XDeclaration("1.0","utf-8","yes"),new XElement("People",new XElement("Person",new XAttribute("IDCard","123456789"),new XComment("身份证号是唯一的"),new XElement("Name","张三"),new XElement("Sex","男"),new XElement("Old",20) ) ) ); doc.Save(path);//保存为book.xml文件 Response.Write(doc);//在页面上输出XML文件内容 Response.ContentType = "text/xml";//设置网页显示的类型为XML文件 Response.End(); }
可能有同学会问,怎么感觉不简洁,好麻烦,这些东西好难记.其实呢,你想想在开发的过程中谁会用这种方式来操作XML?反正我是不会的.对吧,咱们主要是使用LINQ来查询XML.
说明一点:使用LINQ创建XML文件的代码是声明式(或函数式)语法的经典应用,用来生成该XML片段的代码与其生成的XML结构非常相似,通过代码能够直观地体现创建XML元素的层次结构.
总结:在创建XML的LINQ语句中,应用XDocument类创建XML文档;应用XDeclaration类创建XML中的声明;应用XElement类创建XML中的元素;应用XAttribute类创建XML中元素的属性;应用XComment类创建XML中的注释.
题目十四:使用LINQ如何查找XML中的元素
参考:先贴代码:
protected void Page_Load(object sender,EventArgs e) { //XML文件存放的目录 string path = Server.MapPath("book.xml"); XElement xes = XElement.Load(path); IEnumerable<XElement> elements = from ee in xes.Elements("Person") where ee.Element("Name").Value == "张三" select ee; foreach (XElement xe in elements) { Response.Write(xe.Name.LocalName+": "+xe.Attribute("IDCard").Value+"<br/>"); } }
还是刚才创建的XML文件,是不是发现使用LINQ查询类似于sql查询呢,本来微软就是仿照sql来开发的LINQ,LINQ在轻量级数据上很好用.
XML主要有元素组成,元素在XML中呈现为树状结构.LINQtoXML能方便灵活的查找XML指定名称的元素.
主要用到的这4个方法的说明如下:
Attribute方法:返回具有指定XNamede此XElement的XAttribute
Element:获取具有指定XName的第一个(按文档顺序)子元素(继承XContainer)
Elements:按文档顺序返回此元素或文档的子元素集合
Load:从URL所指定的文件,TextReader或XmlReader创建新XElement
题目十五:使用LINQ如何修改XML
参考:上代码
protected void Page_Load(object sender,EventArgs e) { //XML文件存放的目录 string path = Server.MapPath("book.xml"); XElement xe = XElement.Load(path); //用LINQ查找要修改的元素 IEnumerable<XElement> element=from ee in xe.Elements("Person") where ee.Attribute("IDCard").Value=="123456789" && ee.Element("Name").Value=="张三" select ee; if (element.Count()>0) { XElement first = element.First(); first.SetAttributeValue("IDCard","987654321"); first.SetElementValue("Name","李四"); } xe.Save(path); Response.Write(xe); Response.ContentType = "text/xml"; Response.End(); }
要修改XML中的元素,首先使用LINQ语句查询要修改的元素;其次调用XElement的SetAttributeValue方法修改元素的属性值,调用SetElementValue方法修改子元素.
问题十六:如何使用LINQ删除XML中的元素
参考:
protected void Page_Load(object sender,EventArgs e) { //XML文件存放的目录 string path = Server.MapPath("book.xml"); XElement xe = XElement.Load(path); //用LINQ查找要修改的元素 IEnumerable<XElement> element=from ee in xe.Elements("Person") where ee.Attribute("IDCard").Value=="987654321" && ee.Element("Name").Value=="李四" select ee; if (element.Count()>0)//存在要删除的元素 { element.First().Remove(); } xe.Save(path); Response.Write(xe); Response.ContentType = "text/xml"; Response.End(); }
其实使用LINQ的代码差不多,LINQ的语法也并不复杂.大家只要稍加练习就能明白其中道理.
总结
本次主要是介绍了一下XML的相关知识,主要是对XML的操作,其中比较重要的是使用DOM和使用LINQ,使用流一般不常用.