详解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();
}
执行效果完全一样


猜你喜欢
- 上周工作中遇到一个奇怪的问题,解决之后想想还是写出来和大家分享一下。故障描述:在A程序中使用Process.Start方法调用一个B.exe
- 一、泛型集合List<T>排序经sort方法之后,采用了升序的方式进行排列的。 List<int> list = n
- 本文实例为大家分享了Java实现宠物商店管理的具体代码,供大家参考,具体内容如下第一种实现方式:抽象类和对象数组public abstrac
- 在实现下拉框的基础上进行二级联动(这个项目有bug添加可以完成,但是修改获取不到对应的值,这个问题解决以后我会在发布一篇文章)JS部分//二
- 概述在mvn clean install时,控制台各种报错,大概有:java:[8,52] 程序包com.xxx不存在java:[98,27
- 目录问题如下:一. 解决问题一(kafka监听不到数据)二. 解决问题二(kafka为什么会有重复数据发送)三. 解决问题三(kafka数据
- 大致思路:注解实现方式:就是用 反射机制. 获取指定的包下使用了注解的类,存储在一个map容器, 然后获取map容器下类的属性, 利用反射给
- 先来个效果图觉得不好看可以自己调整1.绘制数据点线状图一般由数据点和连线组成在绘制连线之前,我们先标出数据点这里我选择用Image图片来绘制
- Android Studio下载(下文统称AS)AS最新版下载请戳:AS下载Android SDK下载SDK安装器下载SDK安装器下载请戳:
- 实例描述现有某班学生的两份成绩,两份成绩中存在一些不一致的记录。需借助于编程方法找出这些不一致的记录。实例代码using System;us
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&
- 中断线程线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等
- 概念 在 HTML 中,<a>, <form>, <img>, <script>,
- 一、什么是 LRU 算法就是一种缓存淘汰策略。计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?
- 一、概述一个Process组件提供了在计算机运行进程的访问权限。 进程,在最简单的术语中,是正在运行的应用。提供对本地和远程进程的访问权限并
- C#备忘录设计模式大家好,老胡又和大家见面了。首先承认今天的博客有点标题党了,人生是没有存档,也没有后悔药的。有存档和后悔药的,那是游戏,不
- Java中存在着两种Random函数:java.lang.Math.Random;调用这个Math.Random()函数能够返回带正号的do
- 引言 在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什
- 本文实例介绍了手机号码归属地接口调用基于C#实现,分享给大家供大家参考,具体内容如下using System;using System.Co
- 一、length()返回此字符串的长度public static void main4(String[] args) { &n