当前位置: 移动技术网 > IT编程>开发语言>c# > C#中基于流的XML文件操作笔记

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

2019年07月18日  | 移动技术网IT编程  | 我要评论

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 方法前,不会写入元素和特性。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网