2016-11-28 64 views
0

的情况下使用XmlWriter.WriteEndDocument()我想知道XmlWriter.WriteStartDocument()XmlWriter.WriteEndDocument()背后的原因。是否可以在不调用XmlWriter.WriteStartDocument()

我的方案,我与它的一些数据创建一个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()的功能吗?

+0

@stuartd但在C#中,它与WriteEndDocument()单独工作正常。 –

+0

@stuartd我的问题是“为什么这两个语句不需要将xml声明写入文件?”。只需“WriteEndDocument()”就足以编写xml声明。这似乎很奇怪。 –

+0

@stuartd在XML 1.0(这是最常用的,1.1是非常罕见的),[声明是可选的](http://stackoverflow.com/questions/7007427/does-a-valid-xml-file-require -an-XML声明)。 –

回答

2

the documentationWriteStartDocument,此方法写入其根元素::

在派生类中重写,写入XML声明之前出现的XML声明。

the documentationWriteEndDocument

当在派生类中重写,关闭所有打开的元素和属性,并把作家回到开始的状态。

没有提到任何一个与另一个有关或依赖于另一个,事实上你的实验似乎证明了这一点。

与其他类似命名的方法对(如WriteStartElementWriteEndElement)不同,调用其中一个方法不会导致您进入文档无效的状态。也就是说,我仍然建议你应该在写文档的开始和结束时给他们打电话,因为这显然是API打算做的事情。

另外,很少需要直接使用XmlReaderXmlWriter。它们是非常低级别的XML API。我建议你去探索一下LINQ to XML和XmlSerializer的大多数用例。

+0

感谢您的回答。这个是有帮助的。 –