我正在使用不导入缩写的空 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>
此解决方法的问题在于它添加了换行符(请注意元素位于不同的行上)。这对您来说可能是可以接受的,但会导致我的旧应用程序出现问题。