【C# XML】XmlReader和XmlWrite

C#(3):XmlReader ,XmlWriter(抽象类)

 

XmlReader 类 (System.Xml) | Microsoft Docs

XmlWriter 类 (System.Xml) | Microsoft Docs

一、概述

1、XMLReader为抽象类,其派生类有:

  • XmlDictionaryReader
  • XmlNodeReader
  • XmlTextReader(.net 2.0 以后不建议使用 与IO命名空间中的TextReader对象一起使用)、
  • XmlValidatingReader(net 2.0 以后不建议使用 添加了DTD和模式验证,提供数据的有效性验证)。
•XmlReader reader =new XmlTextReader(xmlFile);
•XmlReader reader =new XmlNodeReader(xmNode);

2、XMLWriter为抽象类,其派生类有

  • XmlTextWriter
  • XmlQueryWriter
     
     
     

二、XmlReader

1、概述

XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存。而在有些场景下我们必须考虑尽可能节省内存,这时候就该XmlReaderXmlWriter出场了。

XmlReader非常类似于SAX。它们最大的区别是SAX是一种推模型(所有XML数据都必须由应用程序处理,无论是否需要这些数据),XmlReader是一种拉模型(如果不需要所有的数据,就不需要处理它们)。

XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束Read()方法返回false。

2、常见用法

(1)使用静态方法Create(),返回一个XmlReader对象。

(2)Read()方法可以进入下一个节点。XmlReader类还可以读取强类型化的数据,它有几个ReadValuesAs方法,如、ReadValueAsDouble、ReadValueAsBoolean等。

(3)获取属性数据:AttributeCountry属性确定属性个数。GetAttribute()方法按照名称或索引来获取属性,如果要一次迭代一个属性就可以使用MoveToFirstAttribute()和MoveToNextAttribute()方法。

XmlReader tr = XmlReader.Create("book.xml");
while (tr.AttributeCount; i++){
     richTextBox1.AppendText(tr.GetAttribute(i)+"\r\n");
     }
   }
}

 

3、使用XmlReader类进行验证

有时不但要知道文档的格式是规范的,还是确定文档是有效的。

XmlReader可以使用XmlReaderSettings,根据XSD模式验证XML。

XSD模式添加到XMLSchemaSet中,通过Schema属性可以访问XMLSchemaSet。XsdValidate属性还必须设置为ture,这个属性默认为flase.

XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;
settings.IgnoreWhitespace = true;
XmlReader reader = //settings参数 为可选。
List lists = new List();
CustomerInfo cust = null;

while (reader.Read())//读取下一个节点
{
    if (reader.NodeType == XmlNodeType.Element)
    {
        switch (reader.Name)
        {
            case "row":
                cust = new CustomerInfo();
                if (reader.HasAttributes)//因属性不是文档结构的一部分,要专门检查。属性HasValue是否有值;IsEmptyElement:是否为空元素
                {
                    cust.AppId = reader.GetAttribute("AppID");
                    cust.Version = reader.GetAttribute("Version");
                }
                break;

            case "CustomerID":
                cust.CustomerID = reader.ReadString();
                break;

            case "CompanyName":
                cust.CompanyName = reader.ReadString();
                break;
            default:
                break;

        }
    }
}

 

4、读取字节数据BinHex

下面的示例读取一个内联 BinHex 编码图像。 BinHex 数据嵌入到 元素中。 BinaryWriter 用于创建一个新的二进制数据文件。

public static void BinHexDecodeImageFile() {

  byte[] buffer = new byte[1000];
  int readBytes = 0;

  using (XmlReader reader = XmlReader.Create("output.xml")) {
                       
        FileStream outputFile = new FileStream(@"C:\artFiles\data\newImage.jpg", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
        // Read to the image element.
        reader.ReadToFollowing("image");
        // Read the BinHex data.
        Console.WriteLine("\r\nReading BinHex...");
        BinaryWriter bw = new BinaryWriter(outputFile);
        while ((readBytes = 0) 

        {
            bw.Write(buffer, 0, readBytes);
        }
        outputFile.Close();
        
  }
}

 

三 、XmlWriter

1、概述

与XmlReader一样,XmlWriter类以只向前、未缓存的方式 进行写入。

实例

using System.Text;
using System.Xml;
using System.Xml.Linq;




XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = new UTF8Encoding(false);
settings.NewLineChars = Environment.NewLine;

settings.Indent = true;
using XmlWriter xmlWriter =  XmlWriter.Create("mytext.xml", settings);
xmlWriter.WriteStartDocument(true);
//文档类型
xmlWriter.WriteDocType("Html", null, null, "<!ENTITY h \"hardcover\">");

xmlWriter.WriteStartElement("Html");
//命名空间
xmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www/XMLSchema-instance");
xmlWriter.WriteAttributeString("xsi", "schemaLocation", null, @"http://.xsd");
//指令
String PItext = "type=\"text/xsl\" href=\"book.xsl\"";
xmlWriter.WriteProcessingInstruction("xml-stylesheet", PItext);
//注释
xmlWriter.WriteComment("标题头");
//cdata
xmlWriter.WriteCData(@"<javasritpt><javasritpt>");
 


xmlWriter.WriteStartElement("Head");
xmlWriter.WriteStartElement("mate");
xmlWriter.WriteAttributeString("charset", "utf-8");
xmlWriter.WriteEndElement();

xmlWriter.WriteStartElement("Title");
xmlWriter.WriteString("springsnow - 博客园<");
xmlWriter.WriteEndElement();
xmlWriter.WriteStartElement("key", "Keyword", "http://key");
xmlWriter.WriteString("园子,园子,园子");
//应用实体
xmlWriter.WriteEntityRef("h");
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();
xmlWriter.WriteEndElement();


/*
输出:
    <? xml version = "1.0" encoding = "utf-8" standalone = "yes" ?>
     < !DOCTYPE Html[
     < !ENTITY h "hardcover" >] >
     < Html
    xmlns: xsi = "http://www/XMLSchema-instance" xsi: schemaLocation = "http://.xsd" >
    
        <? xml - stylesheet type = "text/xsl" href = "book.xsl" ?>
         
             < !--标题头-- >
         
             < ![CDATA[< javasritpt >< javasritpt >]] >
         
             < Head >
         
                 < mate charset = "utf-8" />
         
                 < Title > springsnow - 博客园 & lt;</ Title >
              
                      < key:Keyword
                           xmlns:key = "http://key" > 园子,园子,园子 & h;
        </ key:Keyword >
 
     </ Head >
 </ Html >*/

 

posted @ 2022-04-17 16:37  小林野夫  阅读(976)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/