• C#中如何使用 XmlReader 读取XML文件


    C#中如何使用 XmlReader 读取XML文件_C#教程_脚本之家 (jb51.net)

     

    XmlReader通过向前读取文档并识别读取到的元素,为我们提供了一种消耗资源最少的方式来解析XML数据。很多时候我们都是利用XmlReader来对XML文件的数据有效性进行验证(使用XmlReader实例的Read()方法依次读取所有节点,以此判断是否与符合指定的模式)。使用这种非缓存、只读、只向前的方式,每次读取只将很少的数据放入内存,对内存的占用量较小,对于读取内容较大的XML文件不失为一种最佳的选择。

    让我们看看XmlReader类读取XML文件的步骤:

    1、使用XmlReader类的Create()工厂方法创建该类的一个实例,并将被读取的XML文件名作为参数传入方法;

    2、建立一个反复调用Read()方法的循环。这个方法从文件的第一个节点开始,然后读取所有余下的节点,但每次调用只读取一个节点。如果存在一个节点可被读取则返回True,而当到达文件最后时则返回False;

    3、在这个循环中,将检查XmlReader实例的属性和方法,以获得关于当前节点的信息(节点的类型、名称、数据等)。不断执行循环直到Read()返回False;

    下面首先看一个示例:

    Employees.xml文件:

    <?xml version='1.0'?>
    
    <employees>
    
     <employee id="1">
    
     <name>
    
     <firstName>Nancy</firstName>
    
     <lastName>Davolio</lastName>
    
     </name>
    
     <city>Seattle</city>
    
     <state>WA</state>
    
     <zipCode>98122</zipCode>
    
     </employee>
    
     <employee id="2">
    
     <name>
    
     <firstName>Andrew</firstName>
    
     <lastName>Fuller</lastName>
    
     </name>
    
     <city>Tacoma</city>
    
     <state>WA</state>
    
     <zipCode>98401</zipCode>
    
     </employee>
    
    </employees>

    aspx代码:

    <%@ Page Language="C#" %>
    
    <%@ Import Namespace="System.Xml" %>
    
    <script runat="server">
    
     void Page_Load(object sender, EventArgs e)
    
     {
    
     //Location of XML file
    
     string xmlFilePath = Server.MapPath("~/Employees.xml");
    
     try
    
     {
    
     using (XmlReader reader = XmlReader.Create(xmlFilePath))
    
     {
    
     string result;
    
     while (reader.Read())
    
     {
    
     //Process only the elements
    
     if (reader.NodeType == XmlNodeType.Element)
    
     {
    
     result = "";
    
     for (int count = 1; count <= reader.Depth; count++)
    
     {
    
     result += "===";
    
     }
    
     result += "=> " + reader.Name + "<br/>";
    
     lblResult.Text += result;
    
     }
    
     }
    
     }
    
     }
    
     catch (Exception ex)
    
     {
    
     lblResult.Text = "An Exception occurred: " + ex.Message;
    
     }
    
     }
    
     
    
    </script>
    
     
    
    <html xmlns="http://www.w3.org/1999/xhtml" >
    
    <head runat="server">
    
     <title>Reading an XML File using XmlReader</title>
    
    </head>
    
    <body>
    
     <form id="form1" runat="server">
    
     <div>
    
     <asp:label id="lblResult" runat="server" />
    
     </div>
    
     </form>
    
    </body>
    
    </html>

    输出结果:

    => employees
    ====> employee
    =======> name
    ==========> firstName
    ==========> lastName
    =======> city
    =======> state
    =======> zipCode
    ====> employee
    =======> name
    ==========> firstName
    ==========> lastName
    =======> city
    =======> state
    =======> zipCode

    下面让我们看看XmlReader类的属性和方法:

     

     

    AttributeCount

    返回当前节点的属性个数

    Depth

    返回当前节点的深度,用于判断指定的节点是否具有子节点

    EOF

    判断读取器是否位于流的末端

    HasAttribute

    返回指示当前节点是否具有属性的布尔值

    HasValue

    返回指示当前节点是否具有值的布尔值

    IsEmptyElement

    判断当前节点是否是一个空元素

    LocalName

    返回当前节点的本地名称

    Name

    返回当前节点的限定名称

    NamespaceURI

    返回当前节点的命名空间URI

    NodeType

    以XmlNodeType枚举的形式返回当前节点的节点类型

    Prefix

    返回与当前节点相关的命名空间前缀

    ReadState

    以ReadState枚举的形式返回读取器的当前状态

    Settings

    返回用于创建XmlReader实例的XmlReaderSettings对象

    Value

    返回当前节点的值

    ValueType

    获得当前节点的CLR类型

    XmlReader类的重要方法:

     

     

    Close

    通过将ReadState枚举设置为Closed来关闭Xmlreader对象

    Create

    创建XmlReader对象的实例并将其返回给调用程序

    GetAttribute

    获得属性的值

    IsStartElement

    指示当前节点是否是开始标签

    MoveToAttribute

    移动读取器到指定的属性

    MoveToContent

    如果当前节点不是内容节点,则移动读取器至下一个内容节点

    MoveToElement

    移动读取器至包含当前属性的元素;用于列举属性以及想切换至包含所有这些属性的元素

    MoveToFirstAttribute

    移动读取器至当前节点的第一个属性

    MoveToNextAttribute

    移动读取器至当前节点的下一个属性

    Read

    从流中读取下一个节点

    ReadContentAs

    读取提供类型的对象的内容

    ReadElementContentAs

    读取当前元素并返回指定类型对象的内容

    ReadEndElement

    移动读取器越过当前结束标签并移动到下一个节点

    ReadInnerXml

    以字符串的形式读取包括标记在内的当前节点所有内容

    ReadOutXml

    读取包括当前节点标记和子节点在内的节点的内容

    ReadToDescendant

    移动读取器至下一个匹配子孙元素的节点

    ReadToFollowing

    不断读取直至找到指定的元素

    ReadToNextSlibing

    移动读取器至下一个匹配兄弟元素的节点

    ReadValueChunk

    允许读取嵌入在XML文档中的大型文本流

    XmlNodeType枚举的成员:

     

     

    Attribute

    属性

    CDATA

    CDATA区域

    Comment

    XML注释

    Document

    文档对象,表示XML树的根

    DocumentFragment

    文档片断

    DocumentType

    文档类型声明

    Element,EndElement

    开始元素和结束元素

    Entity,EndEntity

    开始实体声明和结束实体声明

    EntityReference

    实体引用(如&lt;)

    None

    有没有读取节点而查询节点类型时使用

    Notation

    DTD中的符号条目

    ProcessingInstruction

    XML处理指令

    SignificantWhitespace

    在混合内容模型文档中的空白,或者设置了xml:space=preserve时使用

    Text

    元素的文本内容

    Whitespace

    标记之间的空白

    XmlDeclaration

    在文档顶部的XML声明

    XmlReaderSettings类的重要属性:

     

     

    CheckCharacters

    允许你获得或者设置用于指示是否执行字符检查的值

    ConformanceLevel

    获得或设置XmlReader对象的符合要求

    IgnoreComment

    允许你获得或设置用于指示是否忽略注释的值

    IgnoreProcessingInstruction

    指定是否忽略处理指令

    IgnoreWhitespace

    指定是否忽略无意义的空格

    ProhibitDtd

    指定是否允许DTD处理

    Schemas

    指定在执行XML验证时使用的XmlSchemaSet

    ValidationFlags

    获得或者设置用于指定模式验证设置的值

    ValidationType

    获得或者设置用于指定所执行的验证类型的值

    XmlResolver

    设置用于访问外部文档的XmlReslover

    通过XmlReaderSettings类,你可以指定一系列由XmlReader对象支持的功能,为此,只需将XmlReaderSettings作为参数传入XmlReader的Create()方法中即可。如下所示:

    <script runat="server">
    
     void Page_Load(object sender, EventArgs e)
    
     {
    
     string xmlFilePath = Server.Mappath("~/Employees.xml");
    
     //Create the XmlReaderSettings object and set appropriate properties
    
     XmlReaderSettings settings = new XmlReaderSettings();
    
     settings.IgnoreComments = true;
    
     settings.IgnoreWhitespace = true;
    
     try
    
     {
    
     //Get reference to the XmlReader object
    
     using (XmlReader reader = XmlReader.Create(xmlFilePath, settings))
    
     {
    
     string result;
    
     while (reader.Read())
    
     {
    
     //Process only the elements
    
     if (reader.NodeType == XmlNodeType.Element)
    
     {
    
     //Reset the variable for a new element
    
     result = "";
    
     for (int count = 1; count <= reader.Depth; count++)
    
     {
    
     result += "===";
    
     }
    
     result += "=> " + reader.Name + "<br/>";
    
     lblResult.Text += result;
    
     }
    
     }
    
     }
    
     }
    
     catch (Exception ex)
    
     {
    
     lblResult.Text = "An Exception occurred: " + ex.Message;
    
     }
    
     }
    
     
    
    </script>

    总结下来,我们可以使用XmlReader类以非缓存、只读、只向前的方式读取XML文件,这种方法占用内存少,推荐大家使用。

  • 相关阅读:
    设置多台机器linux服务器ssh相互无密码访问
    linux环境下 卸载 Oracle11G
    树型结构递归 实体递归 JSON格式
    Fiddler工具非常强大好用
    SQL 分页 SQL SERVER 2008
    Html table 细边框
    Oracle用户密码过期的处理方法
    将目录下面所有的 .cs 文件合并到一个 code.cs 文件中,写著作权复制代码时的必备良药
    微软帮你做了枚举的位运算
    根据身份证算出生日期和性别
  • 原文地址:https://www.cnblogs.com/hofmann/p/16643047.html
Copyright © 2020-2023  润新知