XmlTextWriter
は、XmlWriterSettings
で利用可能なすべてのオプションをサポートしていません。クラスは元々の.Net 1.1でXMLを作成するために作成されたとdocsで説明したように、.NET 2.0でXmlWriter.Create()
の賛成で廃止されました:
の.NET Framework 2.0以降では、我々はあなたのことをお勧めします代わりにSystem.Xml.XmlWriterクラスを使用します。
XmlWriterSettings
のフルサポートは、以前のXmlTextWriter
には追加されておらず、その逆もありません。これは参照元を確認することで確認できます。あなたはreference source for XmlTextWriter.Close()
を見ればたとえば
は、
CloseOutput
のために、基本となるテキストライターが無条件で閉じている:
public override void Close() {
try {
AutoCompleteAll();
}
catch { // never fail
}
finally {
this.currentState = State.Closed;
textWriter.Close();
}
}
がXmlUtf8RawTextWriter.Close()
と比較してください(このクラスはXmlWriter.Create()
によって返されたXML作家の一人である)根本的なところテキストライターは条件付きで閉じている:
public override void Close() {
try {
FlushBuffer();
FlushEncoder();
}
finally {
// Future calls to Close or Flush shouldn't write to Stream or Writer
writeToNull = true;
if (stream != null) {
try {
stream.Flush();
}
finally {
try {
if (closeOutput) {
stream.Close();
}
}
finally {
stream = null;
}
}
}
}
}
(ただし、あなたが常にANSのいずれかを使用して、基になるストリームを閉じないStreamWriter
を構築することができ。Is there any way to close a StreamWriter without closing its BaseStream?からwers)
同様XmlTextWriter.WriteStartDocument()
は、XML宣言を発しないためのオプションを持っているように見えません。
public override void WriteStartDocument() {
StartDocument(-1);
}
// Writes out the XML declaration with the version "1.0" and the standalone attribute.
public override void WriteStartDocument(bool standalone) {
StartDocument(standalone ? 1 : 0);
}
void StartDocument(int standalone) {
try {
if (this.currentState != State.Start) {
throw new InvalidOperationException(Res.GetString(Res.Xml_NotTheFirst));
}
this.stateTable = stateTableDocument;
this.currentState = State.Prolog;
StringBuilder bufBld = new StringBuilder(128);
bufBld.Append("version=" + quoteChar + "1.0" + quoteChar);
if (this.encoding != null) {
bufBld.Append(" encoding=");
bufBld.Append(quoteChar);
bufBld.Append(this.encoding.WebName);
bufBld.Append(quoteChar);
}
if (standalone >= 0) {
bufBld.Append(" standalone=");
bufBld.Append(quoteChar);
bufBld.Append(standalone == 0 ? "no" : "yes");
bufBld.Append(quoteChar);
}
InternalWriteProcessingInstruction("xml", bufBld.ToString());
}
catch {
currentState = State.Error;
throw;
}
}
void InternalWriteProcessingInstruction(string name, string text) {
textWriter.Write("<?");
ValidateName(name, false);
textWriter.Write(name);
textWriter.Write(' ');
if (null != text) {
xmlEncoder.WriteRawWithSurrogateChecking(text);
}
textWriter.Write("?>");
}
それは作家の内部状態を初期化するために呼び出されますが、呼び出されたときにすることStartDocument()
必見のニーズを思わXML宣言は常に書き込まれます。
代わりにdecorator patternを使用し、XmlWriter.Create()
から返された投稿者をラッピングしてデコレータに入れましたか? this answer〜How can I stop empty XML elements self-closing using XmlDocument in C#に示すように、これにより、XmlTextWriter
のサブクラスが基本クラスのメソッドに渡す前に出力をカスタマイズする方法と同様に、出力を下位のXmlWriter
に渡す前に出力をカスタマイズすることができます。
出典
2017-08-06 05:31:57
dbc
No. 'CloseOutput'の場合、[XmlTextWriter.Close()']のリファレンスソース(http://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlTextWriter.cs,839)を見ると、基礎となるテキストライターは無条件に閉じられます。基本ライターが条件付きで閉じられている['XmlUtf8RawTextWriter.Close()'](http://referencesource.microsoft.com/#System.Xml/System/Xml/Core/XmlUtf8RawTextWriter.cs,587)と比較してください。 – dbc
デコレータパターンを使用して、[この回答](https://stackoverflow.com/a/42960980)から[ C#でXmlDocumentを使用して空のXML要素を自動的に閉じることを止めるにはどうすればいいですか?(https://stackoverflow.com/q/42959958) – dbc
しかし、 'CloseOutput'の場合は、[BaseStreamを閉じずにStreamWriterを閉じる方法はありますか?](https:// stackoverflow)の答えの一つを使って、基本ストリームを閉じない' StreamWriter'を常に構築することができます。 com/q/2666888)。 – dbc