频道直达 - 学院 - 下载 - 交易 - 特效 - 字库 - 手册 -排名-工具- 繁體
网页教学网站开发 设为首页
加入收藏
联系我们
建站搜索: 常用广告代码   用户注册 | 用户登陆
您当前的位置:中国建站之家 -> 网站开发设计技术教程 -> XML教程 -> 在.NET Framework中轻松处理XML数据(1-2)

在.NET Framework中轻松处理XML数据(1-2)

作者:未知  来源:http://edu.chinaz.com  发布时间:2005-7-19 0:08:56  发布人:acx

减小字体 增大字体

 XmlReader类

  XML阅读器支持一个编程接口,接口用于连接XML文档,“推出”你要的数据。如果你更深入去了解阅读器,你会发现阅读器工作原理类似于我们的桌面应用程序从数据库中取出数据的原理。数据库服务返回一个游标对象,它包含所有查询结果集,并返回指向目标数据集的开始地址的引用。XML阅读器的客户端收到一个指向阅读器实例的引用。该实例提取底层的数据流并把取出的数据呈现为一棵XML树。阅读器类提供只读、向前的游标,你可以用阅读器类提供的方法滚动游标遍历结果集中的每一条数据。

  从阅读器中看XML文档不是一个标签文本文件,而是一个序列化的节点集合。它是.NET Framework中的一种特殊的游标模式;在.NET Framework中,你找不到其它的任何一个类似的API函数。

  阅读器和XMLDOM分析器有几点不同的地方。XML阅读器是只进的,它没有父、子、祖宗、兄弟节点的概念,而且是只读的。在.NET Framework中,读写XML文档是分为两种完全不同的功能,分别由XmlReader和XmlWriter类来完成。要编辑XML文档,你可以用XMLDOM分析器,或者你自己设计一个类来实现这两种功能。让我们开始分析阅读器的程序功能。

  XmlReader是一个抽象类,你可以继承并扩展它的功能。用户程序一般都基于下面的三种类:XmlTextReader、XmlValidatingReader或者 XmlNodeReader类。所有的这些类都有如图一的属性和图二的方法。要注意的是,某些属性的值实际上依赖于实际的某个阅读器类,不同的类与基类可能不同。因此,在图一中每个属性的说明都是以基类为准的。例如,CanResolveEntity属性在XmlValidatingReader类中只返回true;而在其它的阅读器类中它却可以设为false。同样的,在图二中的某些方法的实际返回值对不同的类可能不同。例如,如果节点类型不是元素节点(element node),所有包含Atrributes的方法的返回值类型都是void。

  XmlTextReader类用只进,只读的方式快速访问XML数据流。阅读器先验证XML文档是否是格式良好的,如果不是则抛出一个异常。XmlTextReader 检查 DTD 的格式是否良好,但不使用 DTD 对文档进行验证。XmlTextReader通过XML文档的文件名,或它的URL,或者从文件流中载入XML文档,然后快速的处理XML文档数据。如果你需要对文档的数据进行验证,你可以用XmlValidatingReader类。

  可以用多种方法创建XmlTextReader类的实例,从硬盘中加载文件,或从URL地址中加载,流(streams)中加载,还有就是从文本中读入XML文档数据:

  XmlTextReader reader = new XmlTextReader(file);

  注意,所有XmlTextReader类的公共(public)构造函数都要求你指定数据源,数据源可以是stream、文件或者其它。XmlTextReader默认的构造函数是受保护的(protected),所以不能直接使用。像.NET Framework中所有的阅读器类一样(如SqlDataReader类),一旦阅读器对象连接并打开,你就可以用Read方法去访问数据了。开始的时候只能用Read方法把指针移到第一个元素;然后我们可以用Read方法或其它方法(如Skip, MoveToContent和ReadInnerXml)移动指针到下一个节点元素。要处理整个XML文档的内容,可以根据Read方法的返回值用一个循环遍历文档内容,因为Read方法返回一个布尔值,当读到文档的尾节点时,Read方法返回false,否则它返回true。



  Figure 3 Outputting an XML Document Node Layout

  string GetXmlFileNodeLayout(string file)
  {
  // 创建一个XmlTextReader类使它指向目标XML文档
  XmlTextReader reader = new XmlTextReader(file);

  // 循环取出节点的文本并放入到StringWriter对象实例中
  StringWriter writer = new StringWriter();
  string tabPrefix = "";

  while (reader.Read())
  {
  // 写开始标志,如果节点类型为元素
  if (reader.NodeType == XmlNodeType.Element)
  {
  //根据元素所处节点的深度,加入reader.Depth个tab符,然后把元素名写入到<>中。
  tabPrefix = new string('\t', reader.Depth);
  writer.WriteLine("{0}<{1}>", tabPrefix, reader.Name);
  }
  else
  {
  //写结束标志,如果节点类型为元素
  if (reader.NodeType == XmlNodeType.EndElement)
  {
  tabPrefix = new string('\t', reader.Depth);
  writer.WriteLine("{0}", tabPrefix, reader.Name);
  }
  }
  }

  // 输出到屏幕
  string buf = writer.ToString();
  writer.Close();

  // 关闭流
  reader.Close();

  return buf;
  }


  图三演示了一个简单的用于输出一个给定的XML文档的节点元素的函数。该函数先打开一个XML文档,然后用循环处理XML文档中所有的内容。每次调用Read方法,阅读器的指针都会向下移一个节点。大部分情况下,用Read方法可以处理的元素节点,但有时候,当你从一个节点移动到下一个节点时,可能是在两个不同类型的节点间移动。但是Read方法不能在属性节点之间移动。阅读器的MoveToContent方法可以让指针从头部节点位置跳到第一个内容节点位置。在ProcessingInstruction, DocumentType, Comment, Whitespace和SignificantWhitespace类型节点中也可以用Skip方法移动指针。

将本文收藏到QQ书签与更多好友分享
[打 印]
[] [返回上一页] [收 藏]
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
精彩推荐
热门文章
· 注册码大全二
· 注册码大全四
· 注册码大全一
· 要10G免费网络硬盘的请进..
· 通过google 赶快来赚美金..
· 注册码大全十
· 头像-qq头像(qq新头像)4..
· 让你轻松架设FTP服务器1..
· 注册码大全三
· 梦幻背景图片7
· 卡通动物图片6
· 网页制作素材-按钮素材2..
· 让你轻松架设FTP服务器5..
· 风景图片8
· 注册码大全九
· 让你轻松架设FTP服务器2..
关注此文读者还看过
· 样 式 表 全 接 触(8)..
· JScript 方法 - item 方..
· Fireworks设计制作Teach..
· 单色背景图Photoshop五种..
· 带你轻松了解 SQL Serve..
· 脸部的绘制方式
· [专题]SQL SERVER实用经..
· 关于PWS的高级设置
· WHATWG发布HTML5标准草案..
· 如何建立一个 XML 的开发..
· 从 PHP 迁移到 ASP.NET
· PHP中的日期及时间
· FWMX利用玻璃滤镜制作水..
· 网页过期的问题
· 万网免费为企业管理域名..
· j2ee的jdbc配置指南--连..
相关文章
· 在.NET环境下绘制模糊数学中..
· 从基础开始:CSS实用教程1-2..
· 在.NET 应用程序中用System..
· 使用在.net 框架上的DataGr..
· 在.Net 中枚举COM对象的方法..
· 在.net应用程序中使用用户控..
· 在.NET 应用程序中用System..
· SQL存储过程在.NET数据库中..
· JSP由浅入深(11-2)
· XML在.net平台下的自定义控..
· XML在.net平台下的自定义控..
· XML在.net平台下的自定义控..
· 在.NET Framework中轻松处理..
· 在.NET Framework中轻松处理..
· 在.NET Framework中轻松处理..
· 在.NET Framework中轻松处理..
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图 - 人才招聘
网站合作、内容监督、商务咨询:QQ: 9576619
Copyright ? 2005--2008 中国建站之家版权所有
粤ICP备05092265号