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

 更新时间:2022年06月06日 08:42:22   作者:springsnow  
这篇文章介绍了C#使⽤XmlReader和XmlWriter操作XML⽂件的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、概述

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)+"\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 = 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:\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 = 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("\r\nWriting 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⽂件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • LINQ投影操作符Select与限制操作符where介绍

    LINQ投影操作符Select与限制操作符where介绍

    这篇文章介绍了LINQ投影操作符Select与限制操作符where,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 浅析C# 函数的传值与传址

    浅析C# 函数的传值与传址

    这篇文章主要介绍了C# 函数的传值与传址,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-11-11
  • c#实现字符串反序输出字符串的实例

    c#实现字符串反序输出字符串的实例

    下面小编就为大家分享一篇c#实现字符串反序输出字符串的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C# MemoryStream类案例详解

    C# MemoryStream类案例详解

    这篇文章主要介绍了C# MemoryStream类案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • C#代码实现扑克牌排序的几种方式

    C#代码实现扑克牌排序的几种方式

    今天小编就为大家分享一篇关于C#代码实现扑克牌排序,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • 详解C#对路径...的访问被拒绝解决过程

    详解C#对路径...的访问被拒绝解决过程

    这篇文章主要介绍了详解C#对路径...的访问被拒绝解决过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • C#中sleep和wait的区别分析

    C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • newtonsoft.json解析天气数据出错解决方法

    newtonsoft.json解析天气数据出错解决方法

    这篇文章主要介绍了NewtonSoft.JSon解析天气数据时出错的解决方法,需要的朋友可以参考下
    2014-02-02
  • C#如何将DataTable导出到Excel解决方案

    C#如何将DataTable导出到Excel解决方案

    由于公司项目中需要将系统内用户操作的所有日志进行转存备份,考虑到以后可能还需要还原,所以最后决定将日志数据备份到Excel中
    2012-11-11
  • C#中异步是4种实现方式详解

    C#中异步是4种实现方式详解

    这篇文章主要为大家详细介绍了C#中异步实现方式的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以跟随小编一起学习一下
    2024-03-03

最新评论