XML应用于处理

XML应用于处理

前言

所谓XML是以一种简单的文本格式存储数据,可以在不同系统间进行数据交换,这使它成为在Internet上传输数据的绝佳路径.

题目一:什么是XML

参考:所谓的XML就是一种用来存储数据的文本.操作XML的主要方式如下:

1.基于DOMXML操作方式

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对象中;最后调用xmlDocSave方法保存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的合法性,XMLXSD就好比数据库中的表数据和表结构的关系.

题目十一:如何实现XML文档和DataSet对象的转换

参考:前面说过DataSet是外部数据存储到内存中的数据容器;XML是一种以标签为基本元素的语言,主要用来承载数据,进行数据交互,说白了也是一种数据容器.既然都是数据容器,那么肯定存在着某种见不得人的关系,说白了就是同穿一条裤衩,可以相互转换.

实现DataSetXML之间的转换主要应用了DataSetReadXml方法WriteXml方法.

因为使用DOM操作XMLW3C的推荐标准,这里我不想多说一些了,等日后我会详细结果使用DOM操作XML.

题目十二:如何入去流格式的XML

参考:ASP.NET中操作XML文件非常灵活.通过XmlReader类可以以非缓存的流方式读取XML数据.首先创建XmlReader类的实力队形xr,其次在while循环中调用xrRead方法(直到读取到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元素的层次结构.

总结:在创建XMLLINQ语句中,应用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方法:返回具有指定XNamedeXElementXAttribute

Element:获取具有指定XName的第一个(按文档顺序)子元素(继承XContainer)

Elements:按文档顺序返回此元素或文档的子元素集合

Load:URL所指定的文件,TextReaderXmlReader创建新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语句查询修改的元素;其次调用XElementSetAttributeValue方法修改元素的属性,调用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,使用流一般不常用.

相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章...
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满...
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看...
一、xml与xslt 相信所有人对xml都不陌生,其被广泛的应用于数据数据传输、保存与序列化中,是一种极为强...