• 基于流的XML文件操作笔记


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

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

    XmlReader的优点是:

    1. 简化状态管理

    2.可以有多个输入流

    3.提取模式可以作为推送模式的基础,反之不行。

    4.提供一个可以将字符串直接写入缓冲区,避免多余字节的的复制。

    5.有选择的处理XML流,可以预先设置处理XML流的方式。

     下面的代码代码逻辑简单不会出现异常所以没有加入异常处理,只是作为测试使用。

    xmlreader 
     1 // ReadXml.cs
    2 // XmlReader示例
    3
    4 using System;
    5 using System.Xml;
    6
    7 class Test
    8 {
    9 public static void Main(string[] args)
    10 {
    11 string path = @"G:\资料\C#面向对象编程\C#面向对象编程\CSharp\Chapter17\books.xml";
    12 XmlReader reader = null;
    13 try
    14 {
    15 // 创建XmlReaderSettings对象
    16 XmlReaderSettings settings = new XmlReaderSettings();
    17 // 设置XmlReaderSettings对象的属性
    18 settings.ProhibitDtd = false;
    19 // 使用XmlReaderSettings对象来创建XmlReader对象
    20 reader = XmlReader.Create(path, settings);
    21 ReadXml(reader);
    22 reader.Close();
    23 Console.ReadKey();
    24 }
    25 catch (Exception ex)
    26 {
    27 Console.WriteLine(ex.Message);
    28 }
    29 finally
    30 {
    31 if (reader != null)
    32 reader.Close();
    33 }
    34 }
    35
    36 private static void ReadXml(XmlReader reader)
    37 {
    38 try
    39 {
    40 // 解析文件,并显示每一个节点
    41 while (reader.Read())
    42 {
    43 switch (reader.NodeType)
    44 {
    45 case XmlNodeType.Element:
    46 if (reader.IsEmptyElement) // 空元素?
    47 {
    48 Console.WriteLine("<{0}/>", reader.Name);
    49 }
    50 else
    51 {
    52 Console.Write("<{0}", reader.Name);
    53 if (reader.HasAttributes) // 属性?
    54 {
    55 while (reader.MoveToNextAttribute())
    56 {
    57 Console.Write(" {0}=\"{1}\"", reader.Name, reader.Value);
    58 }
    59 }
    60 Console.WriteLine(">", reader.Name);
    61 }
    62 break;
    63 case XmlNodeType.Text:
    64 Console.WriteLine(reader.Value);
    65 break;
    66 case XmlNodeType.CDATA:
    67 Console.WriteLine("<![CDATA[{0}]]>", reader.Value);
    68 break;
    69 case XmlNodeType.ProcessingInstruction:
    70 Console.WriteLine("<?{0} {1}?>", reader.Name, reader.Value);
    71 break;
    72 case XmlNodeType.Comment:
    73 Console.WriteLine("<!--{0}-->", reader.Value);
    74 break;
    75 case XmlNodeType.XmlDeclaration:
    76 Console.WriteLine("<?xml version='1.0'?>");
    77 break;
    78 case XmlNodeType.Document:
    79 break;
    80 case XmlNodeType.DocumentType:
    81 Console.WriteLine("<!DOCTYPE {0} [{1}]>", reader.Name, reader.Value);
    82 break;
    83 case XmlNodeType.EntityReference:
    84 Console.WriteLine(reader.Name);
    85 break;
    86 case XmlNodeType.EndElement:
    87 Console.WriteLine("</{0}>", reader.Name);
    88 break;
    89 }
    90 }
    91 }
    92 catch (XmlException ex)
    93 {
    94 Console.WriteLine(ex.Message);
    95 }
    96 }
    97 }

    XmlWriters该编写器提供快速,非缓存,只进的方式来生成包含XML数据的流文件,优点基本和前者一样。

    注意:使用 XmlReader,在调用 Close 方法前,不会读取元素和特性。

    XMLWriter
     1 using System.Xml;
    2
    3 namespace ConsoleApplication1
    4 {
    5 class Program
    6 {
    7 static void Main(string[] args)
    8 {
    9 string path=@"C:\Users\dell\Desktop\test.xml";
    10 XmlWriter writer=null;
    11 XmlWriterSettings settings = new XmlWriterSettings();
    12 settings.Indent = true;
    13 settings.IndentChars=("");
    14 writer = XmlWriter.Create(path, settings);
    15 WriteXml(writer);
    16 writer.Close();
    17 }
    18 private static void WriteXml(XmlWriter writer)
    19 {
    20 writer.WriteStartElement("books");
    21 WriteChildNode(writer, "红楼梦", "曹雪芹", "25");
    22 WriteChildNode(writer, "三国演义", "罗贯中", "20");
    23 WriteChildNode(writer, "水浒传", "施耐庵", "18");
    24 WriteChildNode(writer, "聊斋志异", "蒲松龄", "16");
    25 writer.WriteEndElement();
    26 }
    27 private static void WriteChildNode(XmlWriter writer, string title, string author, string price)
    28 {
    29 writer.WriteStartElement("book");
    30
    31 writer.WriteStartElement("title");
    32 writer.WriteValue(title);
    33 writer.WriteEndElement();
    34
    35 writer.WriteStartElement("author");
    36 writer.WriteValue(author);
    37 writer.WriteEndElement();
    38
    39 writer.WriteStartElement("price");
    40 writer.WriteValue(price);
    41 writer.WriteEndElement();
    42
    43 writer.WriteEndElement();
    44 }
    45 }
    46 }

    基本用法很简单,就是输出前后开关标签 ,主要使用这三个方法WriteStartElement() writer.WriteValue() WriteEndElement()

         注意:  XmlWriter 方法输出 XML 时,在调用 Close 方法前,不会写入元素和特性。

     


  • 相关阅读:
    枚举类型
    [ Java学习 ] “goto语句“ 和 “continue + 标号” 的不同待遇
    [ Java学习 ] 其他知识总结(重要)
    [ Java学习 ] Java变量以及内存分配(非常重要)
    [ Java学习 ] 包语句 package等语句的汇总整理
    [ Java学习 ] 破除思维定势之 C++ 和 Java 的差异 003
    P1601一道高精度的题
    啊哈,我又来了
    算了,有一道水题
    再水一道题
  • 原文地址:https://www.cnblogs.com/rohelm/p/2435549.html
Copyright © 2020-2023  润新知