首頁 > 軟體

C#使⽤XmlReader和XmlWriter操作XML⽂件

2022-06-06 10:01:35

一、概述

1、XMLReader為抽象類,其派生類有:

  • XmlDictionaryReader
  • XmlNodeReader
  • XmlTextReader(與IO名稱空間中的TextReader物件一起使用)、
  • XmlValidatingReader(新增了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.Read()){
if (tr.NodeType == XmlNodeType.Element){
   for (int i = 0; i < tr.AttributeCount; i++){
     richTextBox1.AppendText(tr.GetAttribute(i)+"rn");
     }
   }
}

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 = XmlReader.Create("Customer2.xml", settings);//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:artFilesdatanewImage.jpg", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
        // Read to the image element.
        reader.ReadToFollowing("image");
        // Read the BinHex data.
        Console.WriteLine("rnReading BinHex...");
        BinaryWriter bw = new BinaryWriter(outputFile);
        while ((readBytes = reader.ReadElementContentAsBinHex(buffer, 0, 50))>0) 
        {
            bw.Write(buffer, 0, readBytes);
        }
        outputFile.Close();
        
  }
}

三 、XmlWriter

1、概述

與XmlReader一樣,XmlWriter類以只向前、未快取的方式 進行寫入。

2、常見用法

1、寫Xml檔案宣告

WriteStartDocument方法可以接受一個bool引數(表示standalone,是否為獨立檔案)或者不指定引數standalone保持預設值

xmlWriter.WriteStartDocument(false|true);

注意在使用WriteStartDocument方法後最好呼叫xmlWrite.WriteEndDocument()方法來關閉所有可能未關閉標籤

2、寫xml節點以及屬性

//寫節點
xmlWriter.WriteStartElement("cat");

//給節點新增屬性
xmlWriter.WriteAttributeString("color", "white");

//給節點內部新增文字
xmlWriter.WriteString("I'm a cat");
xmlWriter.WriteEndElement(); 

//或者通過WriteElementString(string,string)方法寫xml節點同時寫下節點值,如下
xmlWriter.WriteElementString("pig", "pig is great");

3、寫CData

xmlWriter.WriteCData("dog is dog");

4、如新增註釋

xmlWriter.WriteComment("*** ");

5、如何設定XmlWriter的輸出格式,解決輸出UTF-16問題

設定xml輸出格式,需要通過XmlWriterSettings類,如下程式碼

XmlWriterSettings settings = new XmlWriterSettings();

//要求縮排
settings.Indent = true;

//注意如果不設定encoding預設將輸出utf-16
 //注意這兒不能直接用Encoding.UTF8如果用Encoding.UTF8將在輸出文字的最前面新增4個位元組的非xml內容
settings.Encoding = new UTF8Encoding(false);

 //設定換行符
settings.NewLineChars = Environment.NewLine;

6、寫入其他物件中

XmlWriter類可以把Xml寫入一個流、檔案、StringBuilder、TextWriter或另一個XmlWriter物件中。

7、名稱空間的支援

XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("x","root","urn:1");
w.WriteStartElement("y","item","urn:1");
w.WriteAttributeString("abc","urn:1","xyz");
w.WriteEndElement();
w.WriteEndElement();
w.Close();

3、XmlWriter完整的程式碼範例

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.IndentChars = "t";
settings.NewLineOnAttributes = false;
settings.ConformanceLevel = ConformanceLevel.Auto;
settings.OmitXmlDeclaration = false;

//注意如果不設定encoding預設將輸出utf-16
//注意這兒不能直接用Encoding.UTF8如果用Encoding.UTF8將在輸出文字的最前面新增4個位元組的非xml內容
settings.Encoding = new UTF8Encoding(false);

//設定換行符
settings.NewLineChars = Environment.NewLine;

XmlWriter writer = XmlWriter.Create("CustomerNewElementArribute.xml", settings);//settings引數 為可選。
//使用xmlwriter寫入StringBuiler和Stream:
//StringBuilder builder = new StringBuilder();
//XmlWriter writer = XmlWriter.Create(builder, settings);
//MemoryStream stream = new MemoryStream();
//XmlWriter writer = XmlWriter.Create(stream, settings);
writer.WriteStartDocument();//寫Xml宣告:可選參數列示standalone,是否為獨立檔案
writer.WriteComment("XXX"); //寫註釋
writer.WriteStartElement("Table");//寫複雜元素(元素含有子元素)
for (int i = 1; i < 10; i++)
{
    writer.WriteStartElement("row");
    writer.WriteAttributeString("Version", "2.0");
    writer.WriteAttributeString("AppID", "111");
    writer.WriteElementString("CustomerID", "cmz" + i.ToString());//寫簡單元素
    writer.WriteElementString("CompanyName", "程沐喆" + i.ToString());
    writer.WriteEndElement();
}

writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
writer.Close();

4、寫入位元組資料BinHex

//用 WriteBinHex 方法編寫 BinHex 資料。 BinHex 資料嵌入在  元素。
int bufferSize = 1000;
byte[] buffer = new byte[bufferSize];
int readBytes = 0;

using (XmlWriter writer = XmlWriter.Create("output.xml"))
{
    FileStream inputFile = new FileStream(@"C:sunset.jpg", FileMode.OpenOrCreate,FileAccess.Read, FileShare.Read);
    writer.WriteStartDocument();
    writer.WriteStartElement("image");
    BinaryReader br = new BinaryReader(inputFile);
    Console.WriteLine("rnWriting BinHex data...");

    do
    {
        readBytes = br.Read(buffer, 0, bufferSize);
        writer.WriteBinHex(buffer, 0, readBytes);
    } while (bufferSize <= readBytes);
    br.Close();

    writer.WriteEndElement();//
    writer.WriteEndDocument();
}

到此這篇關於C#使⽤XmlReader和XmlWriter操作XML⽂件的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com