详解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();
}
当然也可以用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();
}
执行效果完全一样
猜你喜欢
- AssertJ是我目前见过的最强大的断言api,没有之一。官网传送门为什么使用assertJ?1、流式断言,代码即用例,直观易懂。举个例子:
- mybatis-plus 新增/修改 自动填充指定字段1.需要修改的字段在模型类上添加@TableField(fill = FieldFil
- Android内部没有控件来直接显示文档,跳转WPS或其他第三方文档App体验性不好,使用腾讯X5内核能很好的解决的这一问题。一、下载腾讯X
- 前言好久没有更新博客了,今天和大家分享一个关于emoji表情持久化问题,相信做web开发的都遇到过这样的问题,因为我们知道mysql的utf
- 注入集合(数组、List、Map、Set)类型属性(1)创建类,定义数组,list,map,set类型属性,并且生成对应的set方法。(2)
- Java 分割字符串java.lang.String 的 split() 方法, JDK 1.4 or laterpublic
- 目前市面上流行的爬虫以python居多,简单了解之后,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想,java有没
- 用Java编写一个简单的酒店管理系统,供大家参考,具体内容如下为某个酒店编写程序:酒店管理系统,模拟订房、退房、打印所有房间状态等功能。1、
- 本文实例讲述了JAVA随机打乱数组顺序的方法。分享给大家供大家参考。具体实现方法如下:import java.util.Random;&nb
- 闲来无事,用C++做了一个图书管理系统,主要有借书、还书、图书管理、用户管理等功能,主要用到的技术有容器和文件,以及类的封装#include
- 本文实例讲述了Java基于解释器模式实现定义一种简单的语言功能。分享给大家供大家参考,具体如下:一 模式定 * 释器模式:就是给定一个语言的文
- 安装nodejs首先电脑中需要安装nodejs,这个就不多提了,windows就是下载node.exe,一步步安装就可以了。如需安装可参考一
- 一、Java把这些不同来源和目标的数据都统一抽象为数据流。Java语言的输入输出功能是十分强大而灵活的。在Java类库中,IO部分的内容是很
- 本文实例为大家分享了Java实现寻找迷宫出路的具体代码,供大家参考,具体内容如下项目名称寻找迷宫出路项目描述给定一个自定义迷宫,0表示能通过
- 快速排序快速排序是一种比较高效的排序算法,采用“分而治之”的思想,通过多次比较和交换来实现排序,在一
- 查询文档 & 基本操作为了方便学习, 本节中所有示例沿用上节的索引按照ID单个GET class_1/_doc/1查询结果:{ &n
- MyBatis Plus是一个MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。Mybati
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.链表链表 (Linked List) 是一种递归的动态数
- URL(Uniform Resource Locator)是统一资源 * ,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,
- SSM在Controller中添加事务管理本人使用:集成开发环境:idea项目管理工具:maven数据库:oracle框架:Spring+S