zoukankan      html  css  js  c++  java
  • C#中基于流的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#面向对象编程CSharpChapter17ooks.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:UsersdellDesktop est.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 方法前,不会写入元素和特性。

  • 相关阅读:
    getchar()详解
    ACM错误提示
    关于printf()函数和浮点数
    PCB蚀刻,盐酸不好买,三氯化铁不方便,用这个吧【转】
    wps自动半角符转全角符取消笔记
    万恶的oj笔记之【111028】
    hdu1142 深搜+dp+最短路径。
    pl2303电路图。。
    sencha touch 监控 Carousel 旋转事件
    正则表达式限制文本框输入内容
  • 原文地址:https://www.cnblogs.com/niuniu0108/p/7449368.html
Copyright © 2011-2022 走看看