简介C#读取XML的两种方式
xml作用
对于xml,想必各位都比较了解,我也就不用费笔墨来描述它是什么了,我想在未来的web开发中xml一定会大放异彩,xml是可扩展标记语言,使用它企业可以制定一套自己的数据格式。用于internet的数据传输,我想,这是xml对于我们这些程序员最诱人的地方!
我们今天的主题不是论述xml的好处,而是讨论在c#中如何使用xml。下面我们来了解一下使用程序访问xml的一些基础理论知识。
访问的两种模型:
在程序中访问进而操作xml文件一般有两种模型,分别是使用dom(文档对象模型)和流模型,使用dom的好处在于它允许编辑和更新xml文档,可以随机访问文档中的数据,可以使用xpath查询,但是,dom的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题。流模型很好的解决了这个问题,因为它对xml文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文档中执行向后导航操作。虽然是各有千秋,但我们也可以在程序中两者并用实现优劣互补嘛,呵呵
一、dom文档对象模型操作
using system.xml;
xmldocument xml=new xmldocument();//初始化一个xml实例
xml.load(path);//导入指定xml文件
xml.load(httpcontext.current.server.mappath("~/file/bookstore.xml"));xmlnode root=xml.selectsinglenode("/root");//指定一个节点
xmlnodelist childlist=root.childnodes;//获取节点下所有直接子节点
xmlnodelist nodelist=xml.selectnodes("/root/news");//获取同名同级节点集合string id=node.attributes["id"].value;//获取指定节点的指定属性值
string content=node.innertext;//获取指定节点中的文本
root.haschildnodes;//判断该节点下是否有子节点
1.xmldocument类的属性
xmldocument类的属性及说明如下表所示。
属性 |
说明 |
attributes |
当前节点的属性集合 |
baseuri |
当前节点的基uri |
childnodes |
节点的所有子节点 |
documentelement |
文档的根 |
documenttype |
doctype 声明的节点 |
firstchild |
节点的第一个子节点 |
haschildnodes |
是否有任何子节点 |
implementation |
获取当前文档的 xmlimplementation对象 |
innertext |
节点包含的所有文本内容 |
innerxml |
节点所包含的所有xml内容 |
isreadonly |
当前节点是否是只读的 |
item |
获取指定的子元素 |
lastchild |
最后一个子节点 |
localname |
获取节点的本地名称 |
name |
获取节点的限定名 |
namespaceuri |
获取该节点的命名空间 uri |
nametable |
获取与此实现关联的 xmlnametable |
nextsibling |
获取紧接在该节点之后的节点 |
nodetype |
获取当前节点的类型 |
outerxml |
获取表示此节点及其所有子节点的标记 |
ownerdocument |
获取当前节点所属的 xmldocument |
parentnode |
获取该节点(对于可以具有父级的节点)的父级 |
prefix |
获取或设置该节点的命名空间前缀 |
preservewhitespace |
获取或设置一个值,该值指示是否在元素内容中保留空白 |
previoussibling |
获取紧接在该节点之前的节点 |
schemainfo |
返回节点的后架构验证信息集 (psvi) |
schemas |
获取或设置与此 xmldocument 关联的 xmlschemaset 对象 |
value |
获取或设置节点的值 |
xmlresolver |
设置 xmlresolver 以用于解析外部资源 |
2.xmldocument类的方法
xmldocument类的方法及说明如下表所示。
方法 |
说明 |
appendchild |
将指定的节点添加到该节点的子节点列表的末尾 |
createattribute |
创建具有指定名称的 xmlattribute |
createcdatasection |
创建包含指定数据的 xmlcdatasection |
createcomment |
创建包含指定数据的 xmlcomment |
createdocumentfragment |
创建 xmldocumentfragment |
createdocumenttype |
返回新的 xmldocumenttype 对象 |
createelement |
创建 xmlelement |
createentityreference |
创建具有指定名称的 xmlentityreference |
createnavigator |
创建一个用于导航此文档的新 xpathnavigator 对象 |
createnode |
创建 xmlnode |
createprocessinginstruction |
创建一个具有指定名称和数据的 xmlprocessinginstruction |
createsignificantwhitespace |
创建一个 xmlsignificantwhitespace 节点 |
createtextnode |
创建具有指定文本的 xmltext |
createwhitespace |
创建一个 xmlwhitespace 节点 |
createxmldeclaration |
创建一个具有指定值的 xmldeclaration 节点 |
getelementbyid |
获取具有指定 id 的 xmlelement |
getelementsbytagname |
返回一个 xmlnodelist ,它包含与指定名称匹配的所有元素的列表 |
getnamespaceofprefix |
查找当前节点范围内离给定的前缀最近的 xmlns 声明,并返回声明中的命名空间 uri |
getprefixofnamespace |
查找当前节点范围内离给定的命名空间 uri 最近的 xmlns 声明,并返回声明中定义的前缀 |
gettype |
获取当前实例的 type |
importnode |
将节点从另一个文档导入到当前文档 |
insertafter |
将指定的节点紧接着插入指定的引用节点之后 |
insertbefore |
将指定的节点紧接着插入指定的引用节点之前 |
load |
加载指定的 xml 数据 |
loadxml |
从指定的字符串加载 xml 文档 |
normalize |
将xmltext 节点都转换成“正常”形式 |
prependchild |
将指定的节点添加到该节点的子节点列表的开头 |
readnode |
根据 xmlreader 中的信息创建一个 xmlnode 对象。读取器必须定位在节点或属性上 |
removeall |
移除当前节点的所有子节点和/或属性 |
removechild |
移除指定的子节点 |
replacechild |
用新节点替换旧节点 |
save |
将 xml 文档保存到指定的位置 |
selectnodes |
选择匹配xpath 表达式的节点列表 |
selectsinglenode |
选择匹配 xpath 表达式的第一个 xmlnode |
supports |
测试 dom 实现是否实现特定的功能 |
validate |
验证 xmldocument 是不是 schemas 属性中包含的 xml 架构定义语言 (xsd) 架构。 |
writecontentto |
将 xmldocument 节点的所有子级保存到指定的 xmlwriter 中 |
writeto |
将 xmldocument 节点保存到指定的 xmlwriter |
下面对常用的方法进行介绍。
(1)load方法
该方法可以从一个字符串指定的xml文件或是一个流对象、一个textreader对象、一个xmlreader对象导入xml数据。
(2)loadxml方法
该方法完成从一个特定的xml文件导入xml数据的功能。默认情况下,loadxml 方法既不保留空白,也不保留有意义的空白。此方法不执行 dtd 或架构验证。
(3)save方法
该方法将xml数据保存到一个xml文件或是一个流对象、一个textreader对象、一个xmlreader对象导入xml数据。
3.xmldocument类的事件
xmldocument类的事件及说明如下表所示。
表 xmldocument类的事件及说明
事件 |
说明 |
nodechanged |
当属于该文档的节点的 value已被更改时发生 |
nodechanging |
当属于该文档的节点的 value 将被更改时发生 |
nodeinserted |
当属于该文档的节点已被插入另一个节点时发生 |
nodeinserting |
当属于该文档的节点将被插入另一个节点时发生 |
noderemoved |
当属于该文档的节点已被从其父级移除时发生 |
noderemoving |
当属于该文档的节点将被从文档中移除时发生 |
http://kb.cnblogs.com/page/42226/