??XmlTextWriter类
??用在本节中的方法创立XML文档显然并不艰苦。多年以来,开发者都是通过在缓存在连接一些字符串,连接好以后再把缓存中字符串输出到文件的方法来创立XML文档。但是以这种方法创立XML文档的方法只有在你保证字符串中不存在任何渺小的错误的时候才有效。.NET Framework通过用XMLwriter供给了更好的创立XML文档的方法。
??XML Writer类以只前(forward-only)的方法输出XML数据到流或者文件中。更重要的是,XML Writer在设计时就保证所有的XML数据都符合W3C XML 1.0推荐规范,你甚至不用担心忘记写闭标签,由于XML Writer会帮你写。XmlWriter是所有 XML writer的抽象基类。.NET Framework只供给唯一的一个writer 类----XmlTextWriter类。
??我们先来看看XML writers和旧的writers的不同点,下面的代码保留了一个string型的数组:
StringBuilder sb = new StringBuilder('');
sb.Append('');
foreach(string s in theArray) {
sb.Append('
sb.Append('\'/>');
}
sb.Append('');
??代码通过循环取出数据中的元素,写好标签文本并把它们累加到一个string中。代码保证输出的内容是格局良好的并且留心了新行的缩进,及支撑命名空间。当创立的文档结构比拟简略时,这种方法可能不会有错误。然而,当你要支撑处理指令,命名空间,缩进,格局化以及实体的时候,代码的数目就成指数级增加,出错的可能性也随之增加。
??XML writer写方法功效对应每个可能的XML节点类型,它使创立xml文档的过程更符合逻辑、更少的信任于繁琐的标记语言。图六演示了怎么样用XmlTextWriter类的方法来连接一个string数据。代码很简洁,用XML writer的代码更轻易读、结构更好。
Figure 6 Serializing a String Array
void CreateXmlFileUsingWriters(String[] theArray, string filename)
{
// Open the XML writer (用默认的字符集)
XmlTextWriter xmlw = new XmlTextWriter(filename, null);
xmlw.Formatting = Formatting.Indented;
xmlw.WriteStartDocument();
xmlw.WriteStartElement('array');
foreach(string s in theArray)
{
xmlw.WriteStartElement('element');
xmlw.WriteAttributeString('value', s);
xmlw.WriteEndElement();
}
xmlw.WriteEndDocument();
// Close the writer
xmlw.Close();
}
??然而XML writer并不是魔术师----它不能修复输进的错误。XML writer不会检查元素名和属性名是否有效,也不保证被用的任何的Unicode字符集合适当前架构的编码集。如上所述,为了避免输出错误,必需要杜尽非XML字符。但是writer没有供给这种方法。
??另外,当创立一个属性节点时,Writer不会检验属性节点的名称是否与已存在的元素节点的名称雷同。最后,XmlWriter类不是一个带验证的Writer类,也不保证输出是否符合schema或者DTD。在.NET Framework中带验证的writer类目前来说还没有供给。但是在我写的《Applied XML Programming for Microsoft .NET (Microsoft Press®, 2002)》书中,我自己写了一个带验证的Writer组件。你可以到下面的网址往下载源码:http://www.microsoft.com/MSPress/books/6235.asp.
??图七列出了XML writer的一些状态值(state)。这些值都源于WriteState枚举类。当你创立一个Writer,它的初始状态为Start,表现你将要配置该对象,实际上writer没有开端。下一个状态是Prolog,该状态是当你调用WriteStartDocument方法开端工作的时候设置的。然后,状态的转换就取决于你的写的文档及文档的内容了。Prolog状态一直保留到当你增加一个非元素节点时,例如注释元素,处理指令及文档类型。当第一个节点也就是根节点写完后,状态就变为Element。当你调用WriterStartAtribute方法时状态转换为Attribute,而不是当你调用WriteAtributeString方法写属性时转换为该状态。假如那样的话,状态应当是Element。当你写一个闭标签(>)时,状态会转换成Content。当你写完文档后,调用WriteEndDocument方法,状态就会返回为Start,直到你开端写另一个文档或者把Writer关掉。
以上就是在.NET Framework中轻松处理XML数据(4-1) 的内容,更多相关内容请关注PHP中文网(www.php.cn)!