1. 程式人生 > 其它 >【C# XML】XmlReader和XmlWrite C#(3):XmlReader ,XmlWriter(抽象類)

【C# XML】XmlReader和XmlWrite C#(3):XmlReader ,XmlWriter(抽象類)

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 >*/