XmlTextWriter类可以把XML写入一个流、文件或TextWriter对象中。与XmlTextReader一样,XmlTextWriter类以只向前、未缓存的方式进行写入。XmlTextWriter的可配置性很高,可以指定是否缩进文本、缩进量、在属性值中使用什么引号以及是否支持命名空间等信息。
下面是一个简单的示例,说明了如何使用XmlTextWriter类,这段代码在XMLWriterSample1文件夹中:
private void button1_Click(object sender, System.EventArgs e)
{
// change to match your path structure
string fileFTEL="..\\..\\..\\booknew.xml";
// create the XmlTextWriter
XmlTextWriter tw=new XmlTextWriter(fileName,null);
// set the formatting to indented
tw.Formatting=Formatting.Indented;
tw.WriteStartDocument();
// Start creating elements and attributes
tw.WriteStartElement("book");
tw.WriteAttributeString("genre","Mystery");
tw.WriteAttributeString("publicationdate","2001");
tw.WriteAttributeString("ISBN","123456789");
tw.WriteElementString("title","The Case of the Missing Cookie");
tw.WriteStartElement("author");
tw.WriteElementString("name","Cookie Monster");
tw.WriteEndElement();
tw.WriteElementString("price","9.99");
tw.WriteEndElement();
tw.WriteEndDocument();
//clean up
tw.Flush();
tw.Close();
}
这里编写一个新的XML文件booknew.xml,并给一本新书添加数据。注意XmlTextWriter会用新文件重写旧文件。本章的后面会把一个新元素或节点插入到现有的文档中,使用FileStream对象作为参数,实例化XmlTextWriter对象。还可以把一个带有文件名和路径的字符串或者一个基于TextWriter的对象作为参数。接着,设置Indenting属性,之后,子节点就会自动从父节点缩进。WriteStartDocument()会添加文档声明。下面开始写入数据。首先是book元素,添加genre、publicationdate 和 ISBN属性。然后写入title、author和price元素,注意author元素有一个子元素名。
单击按钮,生成booknew.xml文件:
<?xml version="1.0"?>
<book genre="Mystery" publicationdate="2001" ISBN="123456789">
<title>The Case of the Missing Cookie</title>
<author>
<name>Cookie Monster</name>
</author>
<price>9.99</price>
</book>
在开始和结束写入元素和属性时,要注意控制元素的嵌套。在给authors元素添加name子元素时,就可以看到这种嵌套。注意WriteStartElement()和 WriteEndElement()方法调用是如何安排的,以及它们是如何在输出文件中生成嵌套的元素的。
除了WriteElementString ()和 WriteAttributeString()方法外,还有其他几个专用的写入方法。WriteCData()可以输出一个Cdata部分(<!CDATA[…])>),把要写入的文本作为一个参数。WriteComment()以正确的XML格式写入注释。WriteChars()写入字符缓冲区的内容,其工作方式类似于前面的ReadChars(),它们都使用相同类型的参数。WriteChar()需要一个缓冲区(一个字符数组)、写入的起始位置(一个整数)和要写入的字符个数(一个整数)。
使用基于XmlReader 和 XmlWriter的类读写XML是非常灵活的,使用起来也很简单。下面介绍如何使用System.Xml命名空间中XmlDocument 和 XmlNode类执行DOM。