C#中基于流的XML文件操作笔记

 更新时间:2015年06月18日 09:59:01   投稿:junjie  
这篇文章主要介绍了C#中基于流的XML文件操作笔记,本文主要是讲解针对XmlReader和XmlWriters两个XML读写类的使用,需要的朋友可以参考下

System.Xml.XmlReader和System.Xml.XmlWriters是两个抽象类,XmlReader提供了对于XML数据的快速,非缓存,只进模式的读取器,XmlWriter表示一个编写器,该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件。

XmlReader与SAX读取器类似,不过前者是提取模式(只进只读的游标),后者是推送模式(将事件推送到应用程序)。

XmlReader的优点是:
1. 简化状态管理
2.可以有多个输入流
3.提取模式可以作为推送模式的基础,反之不行。
4.提供一个可以将字符串直接写入缓冲区,避免多余字节的的复制。
5.有选择的处理XML流,可以预先设置处理XML流的方式。
 下面的代码代码逻辑简单不会出现异常所以没有加入异常处理,只是作为测试使用。

// ReadXml.cs
// XmlReader示例

using System;
using System.Xml;

class Test
{
  public static void Main(string[] args)
  {
    string path = @"G:\资料\C#面向对象编程\C#面向对象编程\CSharp\Chapter17\books.xml";
    XmlReader reader = null;
    try
    {
      // 创建XmlReaderSettings对象
      XmlReaderSettings settings = new XmlReaderSettings();
      // 设置XmlReaderSettings对象的属性
      settings.ProhibitDtd = false;
      // 使用XmlReaderSettings对象来创建XmlReader对象
      reader = XmlReader.Create(path, settings);
      ReadXml(reader);
      reader.Close();
      Console.ReadKey();
    }
    catch (Exception ex)
    {
      Console.WriteLine(ex.Message);
    }
    finally
    {
      if (reader != null)
        reader.Close();
    }
  }

  private static void ReadXml(XmlReader reader)
  {
    try
    {
      // 解析文件,并显示每一个节点
      while (reader.Read())
      {
        switch (reader.NodeType)
        {
          case XmlNodeType.Element:
            if (reader.IsEmptyElement) // 空元素?
            {
              Console.WriteLine("<{0}/>", reader.Name);
            }
            else
            {
              Console.Write("<{0}", reader.Name);
              if (reader.HasAttributes)  // 属性?
              {
                while (reader.MoveToNextAttribute())
                {
                  Console.Write(" {0}=\"{1}\"", reader.Name, reader.Value);
                }
              }
              Console.WriteLine(">", reader.Name);
            }
            break;
          case XmlNodeType.Text:
            Console.WriteLine(reader.Value);
            break;
          case XmlNodeType.CDATA:
            Console.WriteLine("<![CDATA[{0}]]>", reader.Value);
            break;
          case XmlNodeType.ProcessingInstruction:
            Console.WriteLine("<?{0} {1}?>", reader.Name, reader.Value);
            break;
          case XmlNodeType.Comment:
            Console.WriteLine("<!--{0}-->", reader.Value);
            break;
          case XmlNodeType.XmlDeclaration:
            Console.WriteLine("<?xml version='1.0'?>");
            break;
          case XmlNodeType.Document:
            break;
          case XmlNodeType.DocumentType:
            Console.WriteLine("<!DOCTYPE {0} [{1}]>", reader.Name, reader.Value);
            break;
          case XmlNodeType.EntityReference:
            Console.WriteLine(reader.Name);
            break;
          case XmlNodeType.EndElement:
            Console.WriteLine("</{0}>", reader.Name);
            break;
        }
      }
    }
    catch (XmlException ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

        
XmlWriters该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件,优点基本和前者一样。
注意:使用 XmlReader,在调用 Close 方法前,不会读取元素和特性。

XMLWriter
using System.Xml;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      string path=@"C:\Users\dell\Desktop\test.xml";
      XmlWriter writer=null;
      XmlWriterSettings settings = new XmlWriterSettings();
      settings.Indent = true;
      settings.IndentChars=("");
      writer = XmlWriter.Create(path, settings);
      WriteXml(writer);
      writer.Close();
    }
    private static void WriteXml(XmlWriter writer)
    {
      writer.WriteStartElement("books");
      WriteChildNode(writer, "红楼梦", "曹雪芹", "25");
      WriteChildNode(writer, "三国演义", "罗贯中", "20");
      WriteChildNode(writer, "水浒传", "施耐庵", "18");
      WriteChildNode(writer, "聊斋志异", "蒲松龄", "16");
      writer.WriteEndElement();
    }
    private static void WriteChildNode(XmlWriter writer, string title, string author, string price)
    {
      writer.WriteStartElement("book");

      writer.WriteStartElement("title");
      writer.WriteValue(title);
      writer.WriteEndElement();

      writer.WriteStartElement("author");
      writer.WriteValue(author);
      writer.WriteEndElement();
      
      writer.WriteStartElement("price");
      writer.WriteValue(price);
      writer.WriteEndElement();

      writer.WriteEndElement();
    }
  }
}

基本用法很简单,就是输出前后开关标签 ,主要使用这三个方法WriteStartElement() writer.WriteValue() WriteEndElement()
     注意:  XmlWriter 方法输出 XML 时,在调用 Close 方法前,不会写入元素和特性。

相关文章

  • C# 设计模式系列教程-命令模式

    C# 设计模式系列教程-命令模式

    在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。
    2016-06-06
  • C#多线程之Thread中Thread.IsAlive属性用法分析

    C#多线程之Thread中Thread.IsAlive属性用法分析

    这篇文章主要介绍了C#多线程之Thread中Thread.IsAlive属性用法,实例分析了C#判断线程可用状态的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • 给 c# 程序员的十个重要提示

    给 c# 程序员的十个重要提示

    这篇文章主要介绍了给 c# 程序员的十个重要提示,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • Unity中C#和Java的相互调用实例代码

    Unity中C#和Java的相互调用实例代码

    在unity中接入sdk或者定制一些功能时,需要调用系统接口。安卓手机实际操作中,也就是Unity与android相互调用。我们在Unity中使用c#,android中使用java。
    2018-02-02
  • 简单的excel导入导出示例分享

    简单的excel导入导出示例分享

    这篇文章主要介绍了简单的excel导入导出示例分享,需要的朋友可以参考下
    2014-03-03
  • c# 预处理识别硬币的数据集

    c# 预处理识别硬币的数据集

    这篇文章主要介绍了c# 预处理识别硬币的数据集的方法,帮助大家更好的利用c#进行深度学习,感兴趣的朋友可以了解下
    2020-12-12
  • C# 文件下载之断点续传实现代码

    C# 文件下载之断点续传实现代码

    本篇文章主要介绍了C# 文件下载之断点续传实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#中使用CAS实现无锁算法的示例详解

    C#中使用CAS实现无锁算法的示例详解

    CAS(Compare-and-Swap)是一种多线程并发编程中常用的原子操作,用于实现多线程间的同步和互斥访问。本文将利用CAS实现无锁算法,需要的可以参考一下
    2023-04-04
  • C#中Action和Func的区别

    C#中Action和Func的区别

    这篇文章主要介绍了C#中Action和Func的区别,是进行C#程序设计时需要加以注意的知识点,需要的朋友可以参考下
    2014-09-09
  • 基于FineUI Grid控件添加右键菜单

    基于FineUI Grid控件添加右键菜单

    大家对于FineUI Grid控件会添加右键菜单吗,下面小编就给大家详细介绍基于FineUI Grid控件添加右键菜单,需要的朋友可以参考下
    2015-08-08

最新评论