c#中对xml文件的操作

上传人:xiao****1972 文档编号:84977655 上传时间:2019-03-06 格式:DOC 页数:38 大小:1.09MB
返回 下载 相关 举报
c#中对xml文件的操作_第1页
第1页 / 共38页
c#中对xml文件的操作_第2页
第2页 / 共38页
c#中对xml文件的操作_第3页
第3页 / 共38页
c#中对xml文件的操作_第4页
第4页 / 共38页
c#中对xml文件的操作_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《c#中对xml文件的操作》由会员分享,可在线阅读,更多相关《c#中对xml文件的操作(38页珍藏版)》请在金锄头文库上搜索。

1、 Xml作为一个非常重要的纯文本格式已经进入了编程的很多领域,作为一个面向应用层面的c#也一样在很多领域离不开Xml。 但是,c#在很多方面对Xml做了写封装,以至于很多操作Xml的代码,都不需要手动去写。例如,c#写WebService这种需要大量操作Xml的服务,除了极其个别的情况下,基本看不到任何操作Xml的代码。这是c#的一个优势,但是,最近发现正是这样一些c#的优势,导致了新一代c#程序员的能力退化。因为90%的情况下,不需要手动操作Xml,所以,年轻的c#程序员也觉得没必要为了这10%的情况,而去学如何手工读写Xml。真不知道,ms提供了这么简便的工具,是ms做的善事还是作的孽。

2、好吧,废话就不说了,转入主题。1.如何用Xml Dom的方式读取Xml Xml Dom方式是最原始的一种操作Xml的途径,从.net Framework 1.0开始就开始支持Dom方式。1.1如何以Dom方式加载Xml 要读取Xml首先要加载Xml,加载的方式有两种,一种是从流或类似的Reader加载,例如: 当然还可以从字符串加载:1.1读取无namespace的Xml Xml已经准备好了,下面就开始读取这个Xml。现在希望读取data节下面的所有item中的text,那么就可以: 看看运行结果: 但是,这样写的问题有很多,例如在data节点中有非item的节点,这样访问,也就被无差别的把非

3、item项也写出来了。例如把如果数据改成这样: 这样,在data节里面,除了4个item,还有一个other,这个other是不需要的,必须被排除掉,如果直接用第一中ChildNodes去访问的话,会得到这样的结果: 显然“!#”也被选择出来了,这可不是我们所期望的, 所以,改用XPath的方式访问: 其运行结果为: 很好的other项排除在需要的节点外,这才是我们真正想要的结果:)1.2读取有namespace的Xml 和c#一样Xml也有namespace,并且namespace在Xml中的作用巨大,也许你并未感受到namespace的作用,但是,你可能已经不得不面对那些有namespac

4、e的Xml了。 好吧,我们先加载一个有namespace的xml: 这里,我们准备了一个namespaceurn:vwxyzh,并且把这个namespace缩写成v。举个例子来说,v:data就是urn:vwxyzh这个namespace下面的data。 现在再用原来的XPath去跑一下: Oh, no!一个也没有选择出来,为什么会这样哪? 因为原来的/data/item中的data节是没有namespace的data,和urn:vwxyzh的data不是一回事,所以,这个XPath根本定为不到任何节点。 必须要修改部分代码才能达到我们的目的,先来看看Select方法有哪些重载吧: 第一个重载

5、,就是之前使用的那个,第二个重载,需要额外提供一个XmlNamespaceManager实例,一看名字就知道,这个实例是用于管理Xml的Namespace的。再查看一下这个类的成员: 可以发现,创建这个实例需要一个XmlNameTable,谁能提供这个XmlNameTable的实例哪?XmlDocument本身就提供了这个XmlNameTable: 这样,我们就可以修改为: 先创建一个Manager的实例,然后使用AddNamespace方法,把“v”设置为“urn:vwxyzh”的缩写。然后修改XPath,把data修改成v:data,item修改成v:item,就可以了,现在来看一下运行结

6、果: Yeah!这就是我们所需要的。 2 用Dom的方式创建/修改xml 上一篇讲了如何用dom的方式读一个xml,这一篇就讲一下如何用dom的方式去写一个xml。不过,用dom的写Xml本身并不是一个好主意,因为Dom方式本身的废话超多,做一个简单的事情就需要好几句语句,但是作为一个基本的方式还是有必要了解一下的。2.1 用Dom的方式去创建xml 如果想写出这样一个xml: 那么你可能需要这样一大段代码: 分析一下,在dom方式下要创建任何一个xml的节点都必须要使用XmlDocument的对应的Create方法创建,然后再添加到对应的位置,这也就是Dom方式最麻烦的地方。 看看运行结果:

7、 这个xml和我们期望的xml是等价的,只是没有被格式好,好吧,想要一个格式化好的文档,那么就修改一下写xml的部分(在讲xmlwriter的时候还会讲到这个setting类): 再看看运行结果: 这样就和期望的xml一致了。2.2 用Dom的方式去创建有namespace的xml 如果有namespace的xml怎么创建哪? 其实也很简单,换一个重载就可以了,在创建节点的时候用带有namespace的重载就可以了: 再看一下结果:2.3 用Dom的方式去修改xml 修改xml其实也无非就是读取xml然后再做必要的增删改。 在修改之前,首先当然就是要定为到xml的节点,这个在第一篇里面已经讲过

8、。 如果所做的修改是添加节点那么基本上就和上一节的内容相似: 在原来这个xml的基础上添加一个personAllen Lee,可以看到几乎就是把第一篇的读xml和前一节的创建xml结合起来,开看看运行结果吧: 那么删除节点怎么办哪? 例如,要从已经有多个Person的xml中,删除凡是FirstName叫Allen的Person,就可以这样写: 注意,这里用了个XPath去查询所有的FirstName叫Allen的Person,也就是: /v:persons/v:personv:firstName=Allen v是namespace,之前用已经解释过了,这个XPath要找的是根节点里面的(/)

9、persons节点(v:persons)里面的(/)person节点(v:person),那么在这里是什么意思哪?中间的部分代表条件约束,或者说是where,前面的XPath部分已经选择person节点,现在对找到的Person做个条件约束,条件的内容是firstname的值需要是Allen(v:firstName=Allen)。 通过上面的这个XPath就可以定位到一个节点集,c#中为XmlNodeList类型,里面有一系列的节点(例子中为1个),然后将他移除即可,不过该死的Dom Api需要在父节点中删除这个节点,也就是不得不用这种很恶心的写法: node.ParentNode.Remov

10、eChild(node); 修改就暂时讲到这里,其他类型的修改由于比较简单,就展开再说了。 看到这里,想必读者也知道如何操作xml了,但是,Dom Api的繁琐写法确实非常影响工作效率,下一篇,将进入Linq to Xml时代,来看看新的Api带来的巨大的工作效率的提升。 c#进入了3.0时代,引入了强大的Linq,同时提供了Linq to Xml,这个全新的Xml Api。与Linq to Xml相比,传统的DOM Api就显得笨重而繁杂了。Linq to Xml的本质 首先,linq to xml是一种in-memory的技术(官方说法是:LINQ to XML provides an i

11、n-memory XML programming interface that leverages the .NET Language-Integrated Query (LINQ) Framework. LINQ to XML uses the latest .NET Framework language capabilities and is comparable to an updated, redesigned Document Object Model (DOM) XML programming interface.),也就是说,如果用Linq to Xml去打开一个Xml,也就会占

12、用相应的内存。所以和DOM一样,在极端情况下,会出现内存不足。 其次,linq to xml从本质上来说,就是linq to object+一套Xml Api,与linq to sql和linq to entity framework不同,后两者是使用特定的Linq Provider去翻译成对应系统的语言。Linq to Xml的表现 撇开理论的东西,还是来看看最简单的表现吧。如果要创建这样一个Xml: Zhenway Yan http:/ Allen Lee http:/ 我们只需要这样一句语句(可以更简单,当然这个超出了本文的范围):XDocument doc = new XDocumen

13、t( new XDeclaration(1.0, utf-8, null), new XElement(persons, new XElement(person, new XElement(firstName, Zhenway), new XElement(lastName, Yan), new XElement(address, http:/ ), new XElement(person, new XElement(firstName, Allen), new XElement(lastName, Lee), new XElement(address, http:/ ) ) ); 看起来还行,构造一个Xml要比DOM方式简单的多,不过比起直接写Xml还是复杂了点,不过这个方式也可以这么用:var persons = new new FirstName = Zhenway, Last

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号