在我的上一篇文章《C#中使用XML——读取XML target=_blank>C#中使用XML——读取XML 》中和大家讨论了如何使用
NET Framework中提供的类在C#中读取XML以及读取的一些相关概念
那么今天就说一说如何在C#中编写XML文档
起初我觉得用编程的方式去编写XML简直就是自讨苦吃
后来想想还是觉得挺有用的
我想Microsoft那班家伙能编出这些类来应该不是仅仅为了向比尔i盖茨交差吧!至于它的用处嘛……比如说做安装程序啊!我们可以根据在安装过程中用户所选的选项以及一些设置来生成相应的XML文档再根据XML文档来初始化我们的应用程序
空洞的话不说那么多了
下面我们来了解一下具体的实现细节
要编写XML同样是采用流的概念在NET中编写XML的细节是作为XmlWriter类来实现的但该类是抽象类不能够实例化为此我们要想在程序中访问它的方法以实现编写XML的愿望必需使用它的派生类XmlTextWriter该类提供了一系列的属性和方法为我们编写XML做准备下面将详细的介绍这个类
构造函数
cellPadding= border=>public XmlTextWriter(TextWriter);
public XmlTextWriter(Stream Encoding);
public XmlTextWriter(string Encoding);
第一个构造函数是把现有的TextWriter实例传递过去SystemIOTextWriter类是一个有序的字符流
第二个构造函数是把要写入的流作为第一个参数第二个参数是指定XML文档的编码方式默认是UTF可取Encoding的枚举值流可以是FileStreamMemoryStreamNetworkStream等等
第三个构造函数是把希望写入的文件名当作一个字符串(如果存在就重写该文件)传递给第一个参数第二个参数指定编码方式
常用的方法
WriterStartDocument()和WriterEndDocument()方法
第一个方法用来编写XML声明部分如<?xml version= encoding=UTF ?>
第二个方法用来关闭任何打开的元素或属性并将编写器重新设置为 Start 状态
WriterStartElement()和WriteEndElement()方法
第一个方法用来写出指定的开始标记该方法有以下几个重载
cellPadding= border=>WriterStartElement(string localname)
使用传递的字符串作为元素的本地名称
cellPadding= border=>WriterStartElement(string localnamestring namespace)
第一个参数指定元素的本地名称第二个参数指定元素所在的命名空间
cellPadding= border=>WriterStartElement(string prefixstring localnamestring namespace)
第一个参数指定元素的前缀第二个参数指定元素的本地名称第三个参数指定元素所在的命名空间
第二个方法用来写出与开始元素对应的关闭元素如果开始元素不包含任何内容将用一个/>做为关闭元素
WriterStartAttribute()和WriterEndAttribute()方法
第一个方法用于编写一个属性的开头该方法有两个重载
cellPadding=
border=
>WriterStartAttribute(string localname
string namespace)
第一个参数指定属性的本地名称第二个参数指定属性所在的命名空间
cellPadding= border=>WriterStartAttribute(string prefixstring localnamestring namespace)
第一个参数指定属性的前缀第二个参数指定属性的本地名称第三个参数指定属性所在的命名空间
第二个方法用于关闭WriterStartAttribute创建的属性
WriterElementString()方法
该方法可以创建一个包含字符串值的元素它有以下重载
cellPadding= border=>WriterElementString(string localnamestring value)
如果编写这样的代码WriterElementString(paraSome text) 将输出<para>Some text</para>
cellPadding= border=>WriterElementString(string localnamestring namespacestring value)
如果编写这样的代码WriterElementString(paraSome text) 将输出<para xmlns=>Some text</para>
如果编写嵌套几级的元素可使用WriterStartElement()和WriterEndElement()方法如果编写直接包含内容的元素可以使用该方法
WriterAttributeString()方法
类似与WriterElementString()方法在使用上如果属性的值当中不包含实体可直接使用该方法来写出属性如果属性值包含实体可使用WriterStartAttribute()和WriterEndAttribute()方法例如要写出这样的XML——<para author=Do&;a&LPerez/>可编写以下代码
cellPadding= border=>WriterStartElement(para);
WriterStartAttribute(authornull);
WriterString(Do);
WriterCharEntiry(~n);
WriterString(a);
WriterCharEntiry(&);
WriterString(LPerez);
WriterEndAttribute();
WriterEndElement();
该方法有以下重载
cellPadding= border=>WriterAttributeString(string localnamestring value);
WriterAttributeString(string localnamestring namespacestring value);
WriterAttributeString(string prefx string localnamestring namespacestring value);
WriterNode(XmlReader readerbool defattr)方法
该方法可以从XmlReader读取器中复制节点并把它们写入XmlWriter流中第一个参数是XmlReader的实例第二个参数接受一个布尔值决定是否复制元素中的属性考虑下面XML片段
cellPadding= border=><para>
<sent>
The<b>XmlWriter</b>class writes XML content to a Stream
</sent>
</para>
以下代码复制其中的片段reader代表XmlReader的实例writer代表XmlWriter类的实例
cellPadding= border=>while(readerRead())
{
if (readerName == sent && readerNodeType == XmlNodeTypeElement)
{
writerWriterNode(readertrue);
}
}
得到以下输出
cellPadding= border=><sent>
The<b>XmlWriter</b>class writes XML content to a Stream
</sent>
WriterComment(string text)方法用于写出注释
WriterString(string text)方法用于写出文本
WriterCData(string text)方法写出CDATA数据块
WriterBase(byte[] bufferint indexint count)方法将指定的二进制字节编码为 Base 并写出结果文本
Flush()将缓沖区中的所有内容刷新到基础流并同时刷新基础流 Close()关闭此流和基础流
以上对XmlTextWriter类的一些重要方法做了简单介绍下面我们就来看一个例程看看在程序中如何使用这些方法照样还是先来看下运行效果图
javascript:if(thiswidth>)thiswidth=; onclick=javascript:windowopen(thissrc); src=_//JPG width= onload=javascript:if(thiswidth>)thiswidth=; align=absMiddle border=>
Example按纽将向一个文件写出XML声明和一个元素节点以及节点内的文本Example按纽将在Example的基础上添加属性节点嵌套元素以及文本WriteNode按纽使用WriterNode()方法在现有读取器中复制该读取器中的所有元素及属性并写到一个新的XML文档中Example按纽将写一份完整的XML文档Example按纽在Example按纽的基础上另外生成一份文档并向该文档中追加CDATA部分Example按纽将使用WriterBase()方法对一幅图片进行编码并将编码后的数据写到XML文档中Example按纽将使用Example按纽中生成的XML读取其中数据并对其中编码数据进行解码最后生成一张图片
以下是在WriteNode按纽中要使用到的XML文件
唐诗xml
cellPadding=
border=
><?xml version=
encoding=
gb
?>
<唐诗>
<五言绝句>
<作者 字号=太白>李白</作者>
<标题>静夜思</标题>
<内容>床前明月光疑是地上霜举头望明月低头思故乡</内容>
</五言绝句>
<五言绝句>
<作者 字号=太白>李太白</作者>
<标题>春晓</标题>
<内容>春眠不觉晓处处闻啼鸟夜来风雨声花落知多少</内容>
</五言绝句>
<五言绝句>
<作者 字号=季凌>王之涣</作者>
<标题>登鹤雀楼</标题>
<内容>白日依山尽黄河入海流欲穷千里目更上一层楼</内容>
</五言绝句>
<五言绝句>
<作者>李清照</作者>
<标题>如梦令</标题>
<内容>昨夜风疏雨骤浓睡不消残酒试问卷帘人却道海棠依旧知否知否应是绿肥红瘦</内容>
</五言绝句>
</唐诗>