详解C#借助.NET框架中的XmlTextReader类读取XML的方法

XmlTextReader 提供对 XML 数据流的只进只读访问。当前节点指读取器定位到的节点。使用任何读方法推进读取器并且属性反映当前节点的值。
此类实现 XmlReader 并符合 W3C 可扩展标记语言 (XML) 1.0 和“XML 中的命名空间”建议。XmlTextReader 提供以下功能:

  • 执行格式良好的 XML 的规则。
  • XmlTextReader 不提供数据验证。
  • 检查 DocumentType 节点是否是格式良好的。XmlTextReader 检查 DTD 的格式是否正确,但不使用 DTD 进行验证。
  • 对于 NodeType 为 XmlNodeType.EntityReference 的节点,返回单个空 EntityReference 节点(即 Value 属性为 String.Empty)。
  • 不展开默认属性。

因为 XmlTextReader 不执行数据验证所需的额外检查,所以它提供快速格式正确性分析器。

若要执行数据验证,请使用验证 XmlReader。有关更多信息,请参见 使用 XmlReader 验证 XML 数据。
若要从 XmlDocument 中读取 XML 数据,请使用 XmlNodeReader。
XmlTextReader 在发生 XML 分析错误时引发 XmlException。引发异常后,读取器的状态不可预知。例如,报告的节点类型可能不同于当前节点的实际节点类型。使用 ReadState 属性可以检查读取器是否处于错误状态。
有关 XmlReader 类的进一步论述,请参见 用 XmlReader 读取 XML。
安全注意事项:

  • 下面是使用 XmlTextReader 类时的注意事项。
  • XmlTextReader 引发的异常可能会泄漏您不希望冒泡到应用程序的路径信息。应用程序必须捕捉异常并进行相应的处理。
  • DTD 处理在默认情况下是启用的。如果担心出现拒绝服务问题或者正在处理不受信任的源,则应禁用 DTD 处理。将 ProhibitDtd 属性设置为 true 可禁用 DTD 处理。
  • 如果启用了 DTD 处理,则可使用 XmlSecureResolver 限制 XmlTextReader 可访问的资源。还可以设计应用程序以使 XML 处理受内存和时间的约束。例如,在 ASP.NET 应用程序中配置超时限制。
  • XML 数据可包括对 DTD 文件等外部资源的引用。在默认情况下,使用不具有用户凭据的 XmlUrlResolver 对象解析外部资源。通过执行下列操作之一,可以使此操作更加安全:
  • 通过将 XmlResolver 属性设置为 XmlSecureResolver 对象限制 XmlTextReader 可访问的资源。
  • 通过将 XmlResolver 属性设置为空引用(在 Visual Basic 中为 Nothing) 不允许 XmlReader 打开任何外部资源。
  • XML 数据可以包含大量需要很多时间才能处理的属性、命名空间声明、嵌套元素等。若要限制发送到 XmlTextReader 的输入的大小,请创建自定义的 IStream 实现并为其提供 XmlTextReader。
  • ReadValueChunk 方法可用于处理大的数据流。此方法一次读取少量字符,而不是为整个值分配一个字符串。
  • 默认情况下不展开常规实体。调用 ResolveEntity 方法时展开常规实体。

示例:
使用XmlTextReader从头到尾阅读xml文档,比较适合大量数据读取

static void Main(string[] args)
    {
      XmlTextReader reader; 

      if (File.Exists("student.xml"))//如果文件已存在,载入文档
      {
        reader = new XmlTextReader("student.xml");
      }
      else//否则
      {
        return;
      } 

      int count = 0;
      while (reader.Read())//阅读下一个
      {
        if (reader.Name == "student")
        {
          //显示读取的属性和中间文本
          Console.WriteLine(reader.GetAttribute("id") + " " + reader.GetAttribute("age") + " " + reader.ReadString());
          count++;
        }
      }
      reader.Close();//关闭阅读器
      Console.WriteLine("Count is " + count);
      Console.ReadKey();
    }

当然也可以用xmlDocument进行结构化读取,但是读取前系统会把整个文档的结构获取进来

static void Main(string[] args)
    {
      XmlDocument doc = new XmlDocument(); 

      if (File.Exists("student.xml"))//如果文件已存在,载入文档
      {
        doc.Load("student.xml");
      }
      else//否则
      {
        Console.WriteLine("文档不存在!");
        Console.ReadKey();
        return;
      } 

      XmlNodeList list = doc.DocumentElement.SelectNodes("student");//读取根节点的所有子节点,放到XmlNodeList中 

      foreach (XmlNode node in list)//从list中遍历所有节点
      {
        XmlElement ele = (XmlElement)node;//节点可以有中间文本但是没有属性值,所以要先转成element才能读出属性值
        Console.WriteLine(ele.GetAttribute("id") + " " + ele.GetAttribute("age") + " " + ele.InnerText);//读取数据/显示
      } 

      Console.ReadKey();
    }

执行效果完全一样

(0)

相关推荐

  • c#操作xml帮助类分享(xml增删改查)

    复制代码 代码如下: using System;using System.Collections;using System.Xml; namespace Jb51.Com.XmlDAL{public class XmlHelper{#region 公共变量XmlDocument xmldoc;XmlNode xmlnode;XmlElement xmlelem;#endregion #region 创建Xml文档/// <summary>/// 创建一个带有根节点的Xml文件/// </

  • C#自定义处理xml数据类实例

    本文实例讲述了C#自定义处理xml数据类.分享给大家供大家参考.具体分析如下: 这个C#类专门用户处理xml数据,可以大大简化xml的操作,类中封装了常用的xml操作,包括打开.读取xml数据,读取.写入节点数据,通过xpath读取节点数据,导出节点数据等等,还可以根据需要自己扩充类的功能. using System; using System.Data; using System.IO; using System.Xml; namespace DotNet.Utilities { public

  • C#中使用XmlDocument类来创建和修改XML格式的数据文件

    通过XmlDocument类修改XML文档数据,通常需要以下几个主要步骤或其中几个步骤. (1)获取一个包含XML文档数据的XmlDocument类对象,通常有两种方法来实现这个功能: 通过XmlDocument类的构造函数创建不包含任何结点的空对象,常用默认构造函数. (2)通过XmlDocument类的ChildNodes和Item属性获取某个结点(XmlNode类型),通过XmlNode的Name.Value.InnerText等属性修改选中结点的数据. (3)通过XmlDocument类

  • C# 操作XML文档 使用XmlDocument类方法

    W3C制定了XML DOM标准.很多编程语言中多提供了支持W3C XML DOM标准的API.我在之前的文章中介绍过如何使用Javascript对XML文档进行加载与查询.在本文中,我来介绍一下.Net中的XmlDocument类.它支持并扩展了W3C XML DOM标准.它将整个XML文档都先装载进内存中,然后再对XML文档进行操作,所以如果XML文档内容过大,不建议使用XmlDocument类,因为会消耗过多内存.对于很大的XML文档,可以使用XmlReader类来读取.因为XmlReade

  • C#实现XML与实体类之间相互转换的方法(序列化与反序列化)

    本文实例讲述了C#实现XML与实体类之间相互转换的方法.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.Data; using System.Xml; using System.Xml.Serialization; /// <summary> /// Xml序列化与反序列化 //

  • 深入C#中使用SqlDbType.Xml类型参数的使用详解

    在sql server2005以及之后的sql server中引入了Xml数据类型,在C#中使用Xml数据类型需要指定参数类型为SqlDbType,参数值类型需要用SqlXml,如下示例:假定有一种表A,A表有两个字段:ID 类型 int,Data 类型 Xml,我要用C#往表中插入一行记录: 复制代码 代码如下: static void InsertA(int aid, string contentXml){//ConnString是连接字符串,需要额外定义    using (SqlConn

  • C#写入对象或集合类型数据到xml文件的方法

    本文实例讲述了C#写入对象或集合类型数据到xml文件的方法.分享给大家供大家参考.具体实现方法如下: public static string SerializeToXmlString(object objectToSerialize) { MemoryStream memoryStream = new MemoryStream(); System.Xml.Serialization.XmlSerializer xmlSerializer = new System.Xml.Serializati

  • C#实现的XML操作类实例

    本文实例讲述了C#实现的XML操作类.分享给大家供大家参考.具体如下: 这里讲述了C#写的一个XML操作类,包括读取/插入/修改/删除. using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.W

  • C#实现的xml操作类完整实例

    本文实例讲述了C#实现的xml操作类,分享给大家供大家参考,具体如下: using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System

  • 基于C#实现XML文件读取工具类

    本文实例讲述了基于C#实现XML文件读取工具类.分享给大家供大家参考.具体如下: 这是我去年写的一个XML文件读取工具类,现在做了一些调整 基本能满足一般的XML文件读取需求. 更新: 2013年6月26日19:37 Fix了几个Bug,为所有方法添加单元测试,并运行通过:同时调整了几个方法的位置. /// <summary> /// Author: jiangxiaoqiang /// </summary> public class XmlReader { //=========

随机推荐