我想知道XmlWriter.WriteStartDocument()XmlWriter.WriteEndDocument()背后的原因。

在我的场景中,我正在创建一个包含一些数据的XML文档,例如:

XmlWriter xmlWriter = XmlWriter.Create(file);

xmlWriter.WriteStartDocument();

// write xml elements and attributes...

xmlWriter.WriteEndDocument();

xmlWriter.Flush();


序列化时,如果我们跳过对XmlWriter的调用,而仅在最后调用xmlWriter.WriteStartDocument(),则xmlWriter.WriteEndDocument()不会引发任何异常。

以下代码段不会引发任何错误或异常:

XmlWriter xmlWriter = XmlWriter.Create(file);

// write xml elements and attributes...

xmlWriter.WriteEndDocument();

xmlWriter.Flush();


这怎么可能?您能解释WriteStartDocument()WriteEndDocument()的功能吗?

最佳答案

对于WriteStartDocument,对于每个the documentation,此方法将编写XML声明,该声明出现在根元素之前::


  在派生类中重写时,编写XML声明。


对于WriteEndDocument,每个the documentation


  在派生类中重写时,将关闭所有打开的元素或属性,并将编写器重新置于“开始”状态。


没有提及两者之间存在关联或相互依赖,实际上您的实验似乎证明了这一点。

与其他类似命名的方法对(例如WriteStartElementWriteEndElement)不同,在不使用其他方法对的情况下调用其中一个对不能使您进入文档无效的状态。也就是说,我仍然建议您在编写文档的开始和结束时都应调用它们,因为这显然是API希望您执行的操作。

顺便说一句,很少需要像这样直接使用XmlReaderXmlWriter。它们是非常底层的XML API。我建议您在大多数用例中探索LINQ to XML和XmlSerializer

关于c# - 使用XmlWriter.WriteEndDocument()而不调用XmlWriter.WriteStartDocument()是否可行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40842172/

10-12 06:21