文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 18:16

关注

本文小编为大家详细介绍“C#如何使⽤XmlReader和XmlWriter操作XML⽂件”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#如何使⽤XmlReader和XmlWriter操作XML⽂件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、概述

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

•XmlReader reader =new XmlTextReader(xmlFile);•XmlReader reader =new XmlNodeReader(xmNode);

XMLWriter为抽象类,其派生类有

二、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("<strong>dog is dog</strong>");

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⽂件”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯