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

2019-12-30 11:59:03刘景俊
  • 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(); 
        } 
    

    C#,.NET框架,XmlTextReader

     
    当然也可以用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(); 
        }