省略された空の xml 要素をインポートしないレガシー アプリケーションを使用しています。例えば:
悪い空:
<foo />
良い空:
<foo></foo>
これを達成するための解決策を知っています。これを今提示します。
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(Stream stream, Encoding enc) : base(stream, enc)
{
}
public XmlTextWriterFull(String str, Encoding enc) : base(str, enc)
{
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
およびクライアント コード:
var x_settings = new XmlWriterSettings();
x_settings.NewLineChars = Environment.NewLine;
x_settings.NewLineOnAttributes = true;
x_settings.NewLineHandling = NewLineHandling.Replace;
x_settings.CloseOutput = true;
x_settings.Indent = true;
x_settings.NewLineOnAttributes = true;
//var memOut = new MemoryStream();
var writer = new XmlTextWriterFull(outputFilename, Encoding.UTF8); //Or the encoding of your choice
var x_serial = new XmlSerializer(typeof(YOUR_OBJECT_TYPE));
x_serial.Serialize(writer, YOUR_OBJECT_INSTANCE);
writer.Close();
ただし、注意して観察するXmlWriterSettings
と、 はクライアント コードで使用されていません。したがって、xml 出力はひどくフォーマットされています。私の質問は次のとおりです。上記のコードを受け入れるようにするにはどうすればよいXmlWriterSettings
ですか?
ファクトリ作成メソッドとシール/内部/抽象クラスを使用すると、オーバーライドの実装が難しくなります。
別の解決策を受け入れます。上記の解決策と結婚していません。
- 回避策 解決策
ステップ 1: ソリューションに次のクラスを作成します。
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(TextWriter sink) : base(sink)
{
Formatting = Formatting.Indented;
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
ステップ 2: 次のクライアント コードを追加します。YOUR_OBJECT_TYPE と YOUR_OBJECT_INSTANCE を、使用しているクラスとインスタンスに置き換えてください。
TextWriter streamWriter = new StreamWriter(outputFilename);
var writer = new XmlTextWriterFull(streamWriter);
var x_serial = new XmlSerializer(typeof (YOUR_OBJECT_TYPE));
x_serial.Serialize(writer, YOUR_OBJECT_INSTANCE);
writer.Close();
上記の回避策により、次の空の xml 要素の書式設定が生成されます。
<foo>
</foo>
この回避策の問題は、改行が追加されることです (要素が別々の行にあることに注意してください)。これは受け入れられるかもしれませんが、レガシー アプリケーションで問題が発生します。