【发布时间】:2012-11-15 00:49:14
【问题描述】:
我正在使用不导入缩写的空 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>
此解决方法的问题在于它添加了换行符(请注意元素位于不同的行上)。这对您来说可能是可以接受的,但会导致我的旧应用程序出现问题。
【问题讨论】:
-
不知道它是否解决了这种特殊情况,但您可以使用 XmlWriter.Create 重载,它采用现有的编写器和设置。您可以将自己的编写器实现传递给该方法。根据msdn.microsoft.com/en-us/library/a09119h4.aspx,它允许您“向底层 XmlWriter 对象添加附加功能”,但我不知道这是否包括格式。
-
我无法回答我自己的问题。但我确实找到了一个可以接受的解决方法。我会把它贴在这里,希望能帮助别人;但是,我仍然想要解决我的问题。我的解决方法不使用我想要的 XmlWriterSettings。
-
更新:我的旧应用程序不接受上述解决方法,因为完整标签
插入了换行元素;因此标签出现在不同的行上。我正在发布一个赏金,看看我是否可以引起更多的关注。 -
这有点蹩脚和hacky,但你可以输出后处理你的输出并将
>\s+</替换为></ -
你有机会看看我的回答吗?我相当有信心它会解决您的问题。
标签: c# xml serialization