图十二所示的代码演示了客户端用xmltextreadwriter类在读操作的同时修改属性值的优势。在本期的msdn中提供了xmltextreadwriter类的c#和vb源代码下载(见本文开头提供的链接)。
figure 12 changing attribute &#118alues
private void applychanges(string nodename, string attribname,
string oldval, string newval)
{
xmltextreadwriter rw = new xmltextreadwriter(inputfilename.text,
outputfilename.text);
rw.writestartdocument(true, commenttext.text);
/ 手工修改根节点
rw.writer.writestartelement(rw.reader.localname);
/ 开始修改属性
/ (可以修改更多节点的属性)
rw.addattributechange(nodename, attribname, oldval, newval);
/ 循环处理文档
while(rw.read())
{
switch(rw.nodetype)
{
case xmlnodetype.element:
rw.writer.writestartelement(rw.reader.localname);
if (nodename == rw.reader.localname)
/ 修改属性
rw.writeattributes(nodename);
else
/ deep copy
rw.writer.writeattributes(rw.reader, false);
if (rw.reader.isemptyelement)
rw.writer.writeendelement();
break;
}
}
/ close the root tag
rw.writer.writeendelement();
/ close the document and any internal resources
rw.writeenddocument();
}
xmltextreadwriter类不仅可以读xml文档,也可以写xml文档。你可以它来读xml文档的内容,如果需要,你还可以用它来做一些基本的更新操作。基本的更新操作在这里是指修改某个已存在的属性的值或者某个节点的内容,又或者是增加一个新的属性或节点。对于更复杂的操作,最好还是用xmldom分析器。
总结
reader和writer是.net framework中处理xml数据的根本。它们提供了对所有xml数据访问功能的原始的api。reader像一个新的分析器类,它即有xmldom的强大,又有sax的快速简单。writer为简单的创建xml文档而设计。虽然reader和writer都是.net framework中的一小块,但是它们是相互独立的api。在本文中,我们只讨论了怎么样用reader和writer完成一些主要的工作, 介绍了验证分析器的原理机制,并把reader和writer整合在一个单独的类中。上述所有的这些类都是轻量级的,类似于游标式的xmldom分析器。