详解C#借助.NET框架中的XmlTextReader类读取XML的方法
程序员文章站
2022-11-23 22:58:57
xmltextreader 提供对 xml 数据流的只进只读访问。当前节点指读取器定位到的节点。使用任何读方法推进读取器并且属性反映当前节点的值。
此类实现 xmlrea...
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(); }
执行效果完全一样