loading ...
loading...

2008-07-12 | 计算机知识

分享
标签: 跳过  读取 

2)跳过内容-两种方法
·一种方法是调用使用 MoveToContent 方法直接移动到内容节点
MoveToContent()方法检查当前节点以查看它是否是内容节点。
内容节点被定义为任意 Text、CDATA、Element、EndElement、EntityReference 或 EndEntity 节点。如果当前节点不是前述内容节点的类型之一,则将跳过该节点并跳到下一个内容节点或文件结尾。
它一直跳,直到找到下一个内容节点或到文件的结尾才停止。
如果当前节点是一个属性节点,则此方法将读取器移回拥有该属性的元素。

示例:
-----------------------------------------------------------------------------
if (reader.MoveToContent() == XmlNodeType.Element && reader.Name == "price")
 {
    _price = reader.ReadString();
 }
-----------------------------------------------------------------------------

·另一种方法是直接调用 Skip 方法,该方法从当前节点跳过所有子节点到下一个同级节点
如果当前节点类型为XmlNodeType.Element,则调用skip方法将跳到同级的下一个节点上。
如果当前节点是属性节点,则调用skip方法将跳到属性所属元素节点的下一个同级节点上。


3)读方法
·Read()方法:如果成功读取了下一个节点,则为true;如果没有其他节点可读取,则为false
  第一次创建和初始化读取器时,没有可用的信息。必须调用 Read() 读取第一个节点。

·ReadStartElement()方法:
  检查当前节点是否为元素(类型为Element的节点)并将读取器推进到下一个节点

·ReadEndElement()方法:
  检查当前节点是否为结束标记(类型为EndElement的节点)并将读取器推进到下一个节点

·ReadAttributeValue()方法:
  将当前属性节点的属性值分解为一个或多个 Text、EntityReference 或 EndEntity 节点。
  如果有可返回的节点,则返回true。如果进行初始调用时读取器不是定位在属性节点上,或者如果已读取了所有属性值,则返回false
  如果是空属性(如 misc=""),则返回true,同时将属性值分解为 String.Empty 的单个节点
  一般,当读取器移动到一个属性节点上后,通过循环调用ReadAttributeValue方法来分解属性的值

示例:读xml文档 <book genre='novel' misc='sale-item &h; 1987'></book>
---------------------------------------------------------------------
.......
reader.MoveToAttribute("misc");  //移动到属性misc上
while (reader.ReadAttributeValue()) //misc属性值包含实体应用,属性值被分解
{     //分解完属性值后,循环结束
   if (reader.NodeType==XmlNodeType.EntityReference) //遇到实体引用节点
     Console.WriteLine("{0} {1}", reader.NodeType, reader.Name);
   else
     Console.WriteLine("{0} {1}", reader.NodeType, reader.Value);
}
--------------------------------------------------------------------

5)读取字符内容
·ReadElementString方法:读取简单文本元素的方法
  调用ReadElementString方法时,读取器将移动到下一个节点并读取其简单文本内容,如果该节点不是简单文本元素,则会报错。读取完之后,读取器将再向下移动一个节点

·ReadString方法:元素或文本节点的内容当做字符串读取
  如果读取器定位在元素或文本节点以外的位置,或者当前上下文中没有其他文本内容,则返回空字符串

·ReadInnerXml方法:将节点的所有内容(包括子元素、文本内容等)当做字符串读取
  如果当前读取器位于开始标记,则该方法返回开始标记与对应的结束标记之间所有的内容
  如果当前读取器位于属性节点,则该方法返回属性的值
  如果当前节点既非元素,也非属性,则返回空字符串

·ReadOuterXml方法:此方法类似于 ReadInnerXml,但它还返回开始标记和结束标记
  如果当前读取器位于开始标记,则该方法返回  <开始标记>..内容..<结束标记/>  字符串
  如果当前读取器位于属性节点,则该方法返回   属性名="属性值"  字符串
  如果当前节点既非元素,也非属性,则返回空字符串


===================================================

2.XmlValidatingReader类
1)XmlValidatingReader类是一个能够提供 DTD、XDR 和 XSD 验证的读取器,能够提供数据验证、解析常规实体的能力和对默认属性的支持,该类也是继承自 XmlReader 类。

2)XmlValidatingReader类基本上类似于XmlTextReader类,但它增加了ValidationType、Schema和 SchemaType、XmlResolver 等新的属性
·ValidationType属性指示验证的类型,其值域为:Auto,DTD,Schema,XDR,None
·Schema属性用于需要多个xdr或xsd参与验证的情况,Schema属性实质上是一个XmlSchemaCollection
·SchemaType属性返回当前节点的类型:XSD内置类型、用户自定义类型(simpleType/complexType)
·XmlResolver属性用于解析外部实体(比如DTD中定义的外部实体)

3)使用XmlValidatingReader类进行验证的最佳操作:
·创建一个XmlTextReader对象tr,将tr对象传给XmlValidatingReader构造函数生成一个对象trv
·设置XmlValidatingReader类型对象trv的ValidationType属性(默认值为Auto)
·为事件ValidationEventHandler定义和分配事件处理方法ValidationEvent
  trv.ValidationEventHandler += new ValidationEventHandler(this.ValidationEvent)
  因为如果验证出错误时,就会引发trv对象的ValidationEventHandler事件,需要对该事件进行处理
·像使用XmlTextReader类对象那样使用XmlValidatingReader对象trv

用C#读xml文档(流模型) http://www.cnblogs.com/zqf620/archive/2007/01/20/625605.html

分享 分享 |  评论 (3) |  阅读 (?)  |  固定链接 |  发表于 11:56  | 最后修改于 2008-07-12 11:58
搜狐博客温馨提示:搜狐博客官方不会要求参加活动的各位博友缴纳任何的手续费用。请勿轻信留言、评论中的中奖信息,更不要拨打陌生电话及向陌生帐户汇款,谨防受骗!识别更多网络骗术,请 点击查看详情
正在读取评论信息...
您还未登录,只能匿名发表评论。或者您可以 登录 后发表。
 
  *中国人爱国心,搜狗输入法爱国主题皮肤下载>>
表  情:
加载中...
回复通知: 同时用小纸条通知对方该回复