2016-11-28 6 views
0

XmlWriter.WriteStartDocument()XmlWriter.WriteEndDocument()の背後にある理由を知りたいと思います。XmlWriter.WriteStartDocument()を呼び出さずにXmlWriter.WriteEndDocument()を使用することは可能ですか

私のシナリオでは、私は例えば、その中のいくつかのデータをXMLドキュメントを作成しています:

XmlWriter xmlWriter = XmlWriter.Create(file); 

xmlWriter.WriteStartDocument(); 

// write xml elements and attributes... 

xmlWriter.WriteEndDocument(); 

xmlWriter.Flush(); 

をシリアライズしながら、我々はxmlWriter.WriteStartDocument()への呼び出しをスキップして、ただでxmlWriter.WriteEndDocument()を呼び出す場合、XmlWriterは、例外をスローしません。終わり。

以下のコードは、任意のエラーまたは例外をスローしません:

XmlWriter xmlWriter = XmlWriter.Create(file); 

// write xml elements and attributes... 

xmlWriter.WriteEndDocument(); 

xmlWriter.Flush(); 

これが可能であるどのように?そして、WriteStartDocument()WriteEndDocument()の機能について説明できますか?

WriteStartDocumentため the documentationパー
+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-declaration)。 –

答えて

2

、この方法では、ルート要素の前に表示されるXML宣言を書き込み::

派生クラスでオーバーライドされた場合、XML宣言を書き込みます。

そしてthe documentationあたりWriteEndDocumentため

:派生クラスでオーバーライド

は、開いているすべての要素または属性を閉じ、スタート状態に戻ってライターを置きます。

いずれか一方が他方に関連しているか依存しているという記述はなく、実際に実験ではこれを証明しているようです。

WriteStartElementWriteEndElementのような他の同様の名前のメソッドのペアとは異なり、これらのメソッドのいずれかを他のメソッドなしで呼び出すと、ドキュメントが無効な状態になることはありません。つまり、ドキュメントの作成の始めと終わりにAPIを呼び出す必要があることは明らかです。

XmlReaderXmlWriterをこのように直接使用する必要はほとんどありません。それらは非常に低レベルのXML APIです。ほとんどの使用例では、LINQ to XMLとXmlSerializerを調べることをお勧めします。

+0

あなたの答えをありがとう。これは役に立ちます。 –

関連する問題