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
XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存。而在有些场景下我们必须考虑尽可能节省内存,这时候就该XmlReader和XmlWriter出场了。
XmlReader非常类似于SAX。它们最大的区别是SAX是一种推模型(所有XML数据都必须由应用程序处理,无论是否需要这些数据),XmlReader是一种拉模型(如果不需要所有的数据,就不需要处理它们)。
【C#使?XmlReader和XmlWriter操作XML?件】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?件的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- C#下使用XmlDocument操作XML详解
- VMware Workstation和vSphere简介
- #指尖人生#第四篇 模块与包
- #yyds干货盘点# Java检查异常和非检查异常,运行时异常和非运行时异常的区别
- #yyds干货盘点#抬头看天 | 谈谈移动端抓包方式和原理及如何防犯MITM
- Python使用.kv文件的Kivy中的TextInput
- Python使用OpenCV的阈值技术Set-1(简单阈值)
- Python使用OpenCV的阈值技术Set-2(自适应阈值)
- Python使用OpenCV的阈值技术第三组(Otsu Thresholding)
- Python嵌套字典介绍和用法示例