利用.NET 类编写 XML 文档

 

在.NET中编写XML(转)

一、利用.NET 类编写 XML 文档

        XmlWriter 是个抽象类,所以不能直接使用该类中定义的成员,但是可以使用从XmlWrite类中派生的任何类中的成员。.NET Framework 提供的且从XmlWriter类中派生的唯一类是XmlTextWrite。

二、XmlWriter 类

        XmlWriter 类是一个抽象类,它定义了编写XML时可用的基本方法和属性。
        利用XmlWriter 类中定义的方法和属性,还可以实现下面的操作:

        ● 确保XML 文档格式良好。
        ● 确定XML文档是否具有命名空间。
        ● 将XML文档编码为base64、BinHex或者自定义的编码格式。
        ● 把一个文档或者多个文档写成一个流,例如文件或者控制台。
        ● 刷新并结束输出,已定义的XML在这时才流向请求的目的地。
        ● 制定xml:lang和xml:space的作用域。
        ● 定义元素的前缀。
        ● 编写所有的节点类型。

        1、XmlWriter 方法

        主要分析以下方法:

        ● WriteStartDocument()和WriteEndDocument()方法
        ● WriteStartElement()和WriteEndElement()方法
        ● WriteStartAttribute()和writeEndAttribute()方法
        ● WriteElementString()和WriteAttributeString()方法
        ● WriteString()方法
        ●WriteNode()方法

        下面分别研究:

        ①WriteStartDocument()和WriteEndDocument()方法

        文档开头包括:版本号、文档是否独立、文档编码。
        不带任何参数调用WriteStartDocument()将生成这样的XML代码:<?xml version="1.0"?>
        WriteStartDocument(True)将生成这样的XML代码:<?xml version="1.0" standalone="yes"?>
        如果没有指定编码方式,就是用默认的编码方式,即:UTF-8

        ②WriteStartElement()和WriteEndElement()方法

        WriteStartElement()方法有3种重载:
                WriteStartElement(string localname)
                WriteStartElement(string localname,string namespace)
                WriteStartElement(string prefix,string localname,string namespace)

        一旦调用了WriteStartElement()方法,就会打开一个新的元素节点。这样就可以编写属性节点,利用WriteStartElement()方法进行注释,用WriteString()方法写字符串,或者用WriteStartElement()方法来写更多的子元素节点。

        调用了WriteStartElement()方法打开的元素节点要通过调用WriteEndElement()方法关闭。

        还可以通过调用WriteFullEndElement()方法,不管元素节点包不包含内容,该方法都会写出完整的结束元素标记符,关闭任何打开的元素节点。

        看一个例子:
                             程序界面见最下方

private void button1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
           
            //Create document outline
            const string strFileName = "WriteXMLExample.xml";
            XmlTextWriter objXmlTW = new XmlTextWriter(strFileName,Encoding.UTF8);

            //Write XML Declaration
            objXmlTW.WriteStartDocument();

            //Write root element
            objXmlTW.WriteStartElement("ct","ContactDetails","http://www.deltabis.com/Contact");

            objXmlTW.WriteEndElement();

            //End the XML Document
            objXmlTW.WriteEndDocument();

            //Write to the file and close
            objXmlTW.Flush();
            objXmlTW.Close();
        }

XML文档如下:
        <?xml version="1.0" encoding="utf-8"?>
        <ct:ContactDetails xmlns:ct="http://www.deltabis.com/Contact" />

        ③WriteStartAttribute()和writeEndAttribute()方法

        WriteStartAttribute()有两个重载:
                          WriteStartAttribute(string localname);
                          WriteStartAttribute(string prefix,string localname namespace);

        ④ WriteElementString()和WriteAttributeString()方法

        WriteElementString()方法可以编写一个包含字符串值的元素,它有两个重载形式:
                          WriteElementString(string localname,string value);
                          WriteElementString(string localname,string namespace,string value);

        WriteAttributeString()方法有3个重载形式:
                          WriteAttributeString(string localname,string value);
                          WriteAttributeString(string localname,string namespace,string value);
                          WriteAttributeString(string prefix,string localname,string namespace,string value);

        WriteStartElement()方法和WriteElementString()方法,两种编写元素内容的方法的比较。

        WriteStartE.ement("para");
        WriteElementString("sentence","My first sentence.");
        WriteElementString("sentence","My second sentence.");
        WreteEndElement();

        输出结果:

        <para>
            <sentence>My first sentnece</sentence>
            <sentence>My fsecond sentnece</sentence>
        </para>

        在利用WriteElementString()方法时,只能编写文本节点,这是一种把元素写入输出结果中的简捷方法。

        WriteStartAttribute()方法和WriteAttributeString()方法

        WriteStartElement("para");
        WriteStartAttribute("author",null);
            WriteString("Do");
            WriteChatEntiry("й");
            WriteString("a");
             WriteCharEntiry("&");
             WriteString("L.Perez");
        WriteEndAttribute();
        WriteEndElement();

        输出结果:<para author="Do&0241;a&amp;L.Perez"/>

        添加一个属性的例子:

        private void button2_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";

            //Create document outline
            const string strFileName = "WriteXMLExample.xml";
            XmlTextWriter objXmlTW = new XmlTextWriter(strFileName, Encoding.UTF8);

            //Write XML Declaration
            objXmlTW.WriteStartDocument();

            //Write root element
            objXmlTW.WriteStartElement("ct", "ContactDetails", "http://www.deltabis.com/Contact");

            //Write attribute to the root element
            objXmlTW.WriteAttributeString("updateDate","20021201T14:00");

            objXmlTW.WriteEndElement();

            //End the XML Document
            objXmlTW.WriteEndDocument();

            //Write to the file and close
            objXmlTW.Flush();
            objXmlTW.Close();

            textBox1.Text += ReadDocument(strFileName);
        }

        ⑤WriteString()方法

        WriteString()方法可以编写文本内容,这些内容在参数中指定是以字符串形式进行传递,当编写元素节点或者属性节点的内容时,此方法非常有用。该方法可以创建格式良好的XML。148

        ⑥WriteNode()方法

        WriteNode()方法可以从XmlReader实例中复制节点,并把它们写入XmlWrite流中——当希望从输入读取器中复制片断,并把它原封不动地写入到XmlWriter流中时,就可以使用它。
        WriteNode()方法的第一个参数是XmlReader实例,它位于一个节点上。WriteNode()方法的第二个参数boolean参数,他告诉编写器是否复制属性。
        然后从XmlReader对象的当前节点中复制所有的内容,并移到下一个同级节点的开头。实际上它总是复制除Attribute、EndElement和EndEntity节点之外的当前所有节点。就属性节点而言,应利用WriteStartAttribute()方法或者WriteAttributeString()方法。还要注意,对于元素节点来说,元素上的任何属性节点也要复制。

        ⑦其它XmlWrite方法

        ● Close() 方法:关闭任何打开的元素或者属性,最后关闭编写器和所与底层流,将WriteState属性设置为closed。
        ● Flush() 方法:把缓冲区中的所有数据写入到底层流中,然后清除缓冲区。如果希望输出缓冲区中的数据,而不关闭流本身,可以利用此方法。
        ● Close() 方法:编写一个包括文本的文档,该文本被当作参数传递给方法。
            WriteComment("Updated Today.");
             输出结果是:
            <!--Updated Today.-->
        ● WriteDocType() 方法和WriteEntityRef()方法:
                WriteDocType() 有四个参数,第一个参数是必须的,是DOCTYPE的名称,其它参数可选,第二个参数写入PUBLIC属性,第三个参数写入SYSTEM属性,第四个参数是DOCTYPE的内容。看一个例子:

         //Write the XML delcaration
        writer.WriteSartDocument();
         //Write the DocumentType node
        writer.WriteDocType("today",null,null,"<!ENTITY today' Aug o7 2002'>");
        writer.WriteStartElement("para");
        //write modified attribute
        writer.WriteStartAttribute("modified",null);
        writer.WriteEntityRef("today");
        writer.WriteEedAttribute();

        //add todays data
        writer.WriteString("Today's date is");
        writer.WriteEntityRef("today");

        //Write the close tag for the root elemant
        writer.WriteEndElement();
        writer.WriteEntityRef("today");

        //Write the close tag for the root element
        writer.WriteEndElement();
        writer.WriteEndDocument();

        输出的XML文档:

        <?xml version="1.0"?>
        <!DOCTYPE today[<!ENTITY today'August 07 2002'>]>
        <para modified="&today">
            Today's date is &today;
        </para>

         在文档顶部定义today实体,使用WriteEntityRef()方法在文档中多次引用它。

        ● WriteProcessingInstruction() 方法
                该方法将利用参数定义名称或者处理指令,利用第二个参数处理指令文本,例如:
                WriteProcessingInstr("xml-stylesheet","type='text/xsl'href='somefile.xsl'");
                 代码输出如下:
                                       <?xml-stylesheet type="text/xsl"href="somefile.xsl"?>
        ● LookupPrefix() 方法
                该方法返回作为参数传递给函数的命名空间的前缀,如果命名空间是默认的,就返回String.Empty;如果没有相应的命名空就返回空值。
        ● WriteChars() 方法
                 利用该方法可以一次向缓冲区中写入大量的文本。给方法的第一个参数是一个包含输出文本的字符数组,第二个参数是一个指定数组中开始索引的整数,第三个参数是一个表示要写出的字符数的整数。
        ● WriteWhitespace() 方法
                该方法利用一个字符串参数,输出空白字符,以格式化文档。150

        2、XmlWrite 属性

        ①WriteState 属性

        WriteState 枚举值,该值可能是:
        ● Attribute:编写一个属性值
        ● Closed: 已调用编写器的Close()方法
        ● Content:编写元素的内容
        ● Element:编写元素的开始标识符
        ● Prolog: 编写XML声明
        ● Start:    已经实例化编写器,但没有调用编写器方法。WriteEndDocument()方法可以把编写器的状态重新设置为Start,允许创建一个新的XML文档

        ② XmlLang 属性

        XmlLang 是一个只读属性,返回节点的xml:lang作用域,该作用域确定编写节点内容所使用的语言。xml:lang的值可以在节点上定义,也可以从父节点继承。如果没有定义语言,XmlLang属性将返回null。151

        ③ XmlSpace 属性

三、XmlTextWriter 类

        XmlTextWriter 派生于XmlWriter 抽象类。它为XmlWriter 抽象类添加了另外一些属性。

        1、XmlTextWriter 构造函数

        XmlTextWriter 类有三种构造函数。153
        所有这些函数的默认属性如下所示:
                    ● Formatting 属性的默认值为 None
                    ● Indentation 属性的默认值为 2
                    ● IndentChar 属性的默认值为 &#20;(空格符)
                    ● Namespace 属性的默认值为 True
                    ● QuoteChar 属性的默认值为 &#34;(双引号)
                    ● WriteState 属性的默认值为 Start

        2、XmlTextWriter 属性

        下面是XmlTextWriter 增加的额外属性:

        ①Formatting 属性

                这个只读属性允许声明编写器格式化它创建的XML的方式。
                Indented——使子元素依据 Indentation和IndentChar 属性的值进行缩进。
                None——意味着输出结果没有设置任何格式。

        ②Indentation 属性

                Indentation 属性设置节点缩进的字符数(用整数表示),它的默认值是2。只有当Formatting属性的值为Indented时才应用这种属性。
                下面的XmlNodeType成员会受到这中设置的影响:
                    ● DocumentType
                    ● Element
                    ● Comment
                    ● ProcessingInstruction
                    ● CDATA

        ③IndentChar 属性

        当formatting 属性的值为Indented 时,IndentChar属性可以指定进行缩进的字符,它的默认只是空格符(0x20)。因此,所有锁紧操作的默认设置都是两个空格符(将indentation属性设置为2)。
        XML文件的缩进方式是结合Indentation和IndentChar属性来定义的。Indentation属性告诉编译器缩进多少个字符,而IndentChat属性定义用于缩进的字符。
        最好使用下面的空白字符来确保输出的XML时有效的。
                    ● 制表符:0x9
                    ● 换行符:0x10
                    ● 回车符:0x13
                    ● 空格符:0x20

        ④Namespaces 属性

        这个读/些属性可以确定编写器是否支持命名空间,它的默认值为 True。

        ⑤QuoteChar 属性

        这个读/些属性可以确定属性实用的引号,默认设置为双引号(0x34),还可以设置为单引号(0x39)。

        ⑥BaseStream 属性

        这是一个只读属性,返回XmlWriter 所使用的String 对象(如果没有底层的Stream对象其属性值为unll)。154

        3、处理 XmlTextWriter

        private void button3_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";

            //Creates document outline
            const string strFileName = "WriteXMLExample.xml";
            XmlTextWriter objXmlTW = new XmlTextWriter(strFileName,Encoding.UTF8);

            //Sets the indentation for the XML file
            objXmlTW.Formatting = Formatting.Indented;
            objXmlTW.Indentation = 4;

            //Write XML Declaration
            objXmlTW.WriteStartDocument();

            //Write root element
            objXmlTW.WriteStartElement("ct","ContactDetails","http://www.deltabis.com/Contact");

            //Write attribute to the root element
            objXmlTW.WriteAttributeString("updateDate","20021201T14:00");

            //Write a comment describing the document
            objXmlTW.WriteComment("This document contains contact information");

            //Write contact child element node
            objXmlTW.WriteStartElement("contact");

            //Write empty title attribute
            objXmlTW.WriteAttributeString("title",string.Empty);

            //Wtrite <name> element node
            objXmlTW.WriteStartElement("name");

            //Write<first>element node
            objXmlTW.WriteElementString("first","Steven");

            //Write<middle>element node
            objXmlTW.WriteElementString("middle",String.Empty);

            //Write <last> element node
            objXmlTW.WriteElementString("last","Livingstone-Perez");

            //Write Full end of <name> element node
            objXmlTW.WriteFullEndElement();

            //Write full end of <contact> element node
            objXmlTW.WriteFullEndElement();

            objXmlTW.WriteEndElement();

            //Ene the XML Document
            objXmlTW.WriteEndDocument();

            //Write to the file and close
            objXmlTW.Flush();
            objXmlTW.Close();

            textBox1.Text += ReadDocument(strFileName);

        }

        private string ReadDocument(string strFileName)
        {
            //Read the XML into a Text Box
            XmlTextReader objXmlTR = new XmlTextReader(strFileName);

            //Move to the first content node
            objXmlTR.MoveToContent();

            //read outer XML
            string XmlString = objXmlTR.ReadOuterXml();

            //close the reader
            objXmlTR.Close();

            return XmlString;
        }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值