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

作者:hzy3774 时间:2023-01-18 23:31:47 

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();
   }

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

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

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

 执行效果完全一样

标签:C#,XML
0
投稿

猜你喜欢

  • Spring Boot2中如何优雅地个性化定制Jackson实现示例

    2021-09-27 12:21:15
  • SpringBoot集成gRPC微服务工程搭建实践的方法

    2022-03-11 22:10:39
  • 基于C#技术实现身份证识别功能

    2023-10-01 14:16:26
  • Android 给控件添加边框阴影效果

    2021-08-13 17:12:07
  • Android互联网访问图片并在客户端显示的方法

    2021-12-26 21:25:10
  • Java 分割字符串详解及实例代码

    2023-11-29 13:18:42
  • 详解Java线程池队列中的延迟队列DelayQueue

    2023-08-30 01:22:04
  • java 反射调用Service导致Spring注入Dao失效的解决方案

    2021-06-30 15:47:58
  • Java实现断点下载服务端与客户端的示例代码

    2022-07-25 14:16:17
  • 使用Springboot 打jar包实现分离依赖lib和配置

    2023-01-29 18:35:29
  • CentOS 7下JDK8的详细安装步骤

    2022-02-18 12:06:28
  • Java Socket实现多线程通信功能示例

    2022-11-29 03:24:59
  • C#入门教程之集合ArrayList用法详解

    2022-04-30 06:32:13
  • java中String、StringBuffer与StringBuilder的区别

    2021-11-12 13:28:24
  • c#防止多次运行代码收集分享

    2021-09-27 18:28:26
  • 微信Android热更新Tinker使用详解(星空武哥)

    2023-06-08 04:08:17
  • SpringBoot文件分片上传教程

    2023-07-21 21:08:40
  • C#使用HttpPost请求调用WebService的方法

    2022-02-24 07:22:16
  • java并发包JUC同步器框架AQS框架原文翻译

    2022-08-22 22:17:23
  • Android studio将Module打包成Jar的方法

    2021-12-15 20:59:21
  • asp之家 软件编程 m.aspxhome.com