【C# XML】XmlReader和XmlWrite
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文档放到内存中去操作,这样做操作简单,但是很费内存。而在有些场景下我们必须考虑尽可能节省内存,这时候就该XmlReader和XmlWriter出场了。
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 >*/