- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在使用不导入缩写的空 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>
此解决方法的问题在于它添加了一个换行符(请注意元素位于不同的行中)。这对您来说可能是可以接受的,但会导致我的遗留应用程序出现问题。
最佳答案
这个怎么样。
从 http://www.tkachenko.com/blog/archives/000585.html 中获取很棒的 XmlWrappingWriter
类(为了简洁起见,我省略了代码)。
有了它,我们可以创建一个子类如下(与您原来的非常相似):
public class XmlTextWriterFull2 : XmlWrappingWriter
{
public XmlTextWriterFull2(XmlWriter baseWriter)
: base(baseWriter)
{
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
然后可以像这样调用它(同样非常相似):
var x_settings = new XmlWriterSettings();
x_settings.NewLineChars = Environment.NewLine;
x_settings.NewLineOnAttributes = true;
x_settings.NewLineHandling = NewLineHandling.None;
x_settings.CloseOutput = true;
x_settings.Indent = true;
x_settings.NewLineOnAttributes = true;
using (XmlWriter writer = XmlWriter.Create(outputFilename, x_settings))
{
using (XmlTextWriterFull2 xmlTextWriterFull = new XmlTextWriterFull2(writer))
{
var x_serial = new XmlSerializer(typeof(YOUR_OBJECT_TYPE));
x_serial.Serialize(xmlTextWriterFull, YOUR_OBJECT_INSTANCE);
}
}
在我的例子中,一个元素之前被渲染为
<Foo>
</Foo>
成为
<Foo></Foo>
正如您在问题中提到的,这实际上是一个非常棘手的问题,因为一切都是密封的/内部的等等,使得覆盖相当困难。我认为我最大的问题是试图让 XmlWriter
接受 XmlWriterSettings
:除了这种方法,我找不到获得原始 XmlTextWriterFull
的方法遵守给定的 XmlWriterSettings
。
MSDN声明此方法:
XmlWriter.Create(XmlWriter, XmlWriterSettings)
可用于将 XmlWriterSettings
应用于 XmlWriter
。我无法让它像我想要的那样工作(例如,缩进从来没有工作过),并且在反编译代码时,似乎并没有所有设置都用于这个特定的方法,因此我的调用代码只是通过了outputFile
(某种流也可以)。
关于c# - 使用 override void WriteEndElement() 时如何使用 XmlWriterSettings()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13389960/
我正在使用 XmlWriterSettings 将 Xml 写入文件。我有只有属性的元素,没有 child 。我希望它们输出为: 代替 我可以使用 XmlWriterSettings 来实现吗?
我正在尝试为 XDocument 创建一个 XMLWriter,并对其应用设置,但我不知道如何做。 这是我目前所拥有的。 var writerSettings = new XmlWri
我目前有一些直接实例化 XmlTextWriter 对象的代码,它允许我将引号字符设置为单引号(我需要它来生成 XML 以匹配遗留系统)。 EG var fred = new XmlTextWrit
我需要将 XmlWriter 的 XmlWriterSettings 的 OmitXmlDeclaration 属性设置为 false 以不创建 XML 声明。问题是我通过调用 XPathNaviga
我正在使用不导入缩写的空 xml 元素的遗留应用程序。例如: 坏空: 好空: 我知道实现此目标的解决方案,现在我将介绍: public class XmlTextWriterFull : XmlT
我需要使用 ISO Latin 1 编码,但使用编写器设置下方的代码默认返回 UTF8。我在这里缺少什么? XmlDocument xmlDoc = new XmlDocument(); XmlWri
在 VS2008 中使用 .Net 3.5 SP1 我有一个 XmlDocument 并尝试将其写入文件: using (XmlTextWriter tw = new XmlTextWriter(ou
我需要编写一个 XML 片段以供网络服务使用。任何 xml 声明都会导致 Web 服务拒绝请求。为了支持这一点,我有以下类(class): public class ContentQueryCrite
我是一名优秀的程序员,十分优秀!