zoukankan      html  css  js  c++  java
  • C#(3):XmlReader ,XmlWriter(抽象类)

    一、概述

    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)+"
    ");
         }
       }
    }

    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<CustomerInfo> lists = new List<CustomerInfo>();
    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 数据嵌入到 <image> 元素中。 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:artFilesdata
    ewImage.jpg", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write);
            // Read to the image element.
            reader.ReadToFollowing("image");
            // Read the BinHex data.
            Console.WriteLine("
    Reading 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 = "	";
    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 数据嵌入在 <image> 元素。
    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("
    Writing BinHex data...");
    
        do
        {
            readBytes = br.Read(buffer, 0, bufferSize);
            writer.WriteBinHex(buffer, 0, readBytes);
        } while (bufferSize <= readBytes);
        br.Close();
    
        writer.WriteEndElement();// </image>
        writer.WriteEndDocument();
    }
  • 相关阅读:
    Linux oracle操作
    Job
    Oracle创建表空间和用户并分配权限
    Oracle赋予用户查询另一个用户所有表的权限
    plsql中文乱码解决方案
    PLSQL创建Oracle定时任务,定时执行存储过程
    fcntl函数参数F_GETPIPE_SZ、F_SETPIPE_SZ报错引出的关于linux-specific头文件的使用方法
    从Windows Server 2008 迁移mantis到CentOS 6.8
    从Windows Server 2008 迁移VisualSVN到CentOS 6.8
    CentOS 6.8上开启NFS服务给不同用户使用的曲线设置方法
  • 原文地址:https://www.cnblogs.com/springsnow/p/12883701.html
Copyright © 2011-2022 走看看