[英]C# System.Xml.Serialization - use only <a></a> and never <a/>
我的客户遇到一个奇怪的问题-我正在使用XmlSerializer
阅读XML文档(实际上是InfoPath文档),对其进行修改,然后使用XmlSerializer
写出XML文档,然后使用XmlTextWriter
添加一些处理指令。 一切运行良好,并且生成的文档实际上完全符合XML,并且可以由InfoPath读取。 但是,结构发生的变化是原始文档中所有空标签都以<A></A>
形式编写,并且在编写我的文档时,它变成了<A/>
。 由于XML标准,实际上完全相同。 但是,我的客户(一家大公司)显然有一些带有硬编码<A></A>
检查/验证脚本,但是它们失败了。 他现在很沮丧,而且懒得更改脚本,还想要<A></A>
表示法! 如何设置XmlTextWriter
来做到这一点?
您可以通过为XmlSerializer
提供您自己的XmlWriter
子孙来实现,该子孙将重写WriteEndElement
方法 。 默认情况下,此方法根据要输出的元素的内容生成一个空元素( <a />
)或一个结束元素( </a>
)。 您可以更改行为以始终产生完整的结束元素。
public class MyXmlWriter : XmlTextWriter
{
// …constructors etc. omitted for the sake of simplicity…
public override void WriteEndElement()
{
// this should do the trick
WriteFullEndElement();
}
}
但是,还需要做更多的工作,例如此方法的Async
版本,但原则上,应该像上面一样容易实现。 我建议您查看XmlTextWriter.WriteEndElement
的源代码 ,并得出一个更适合您的情况的版本。
老实说,我认为如果您要使用内置的Serializer,那么最好进行查找/替换。 看起来您无法覆盖标记的实际形式,至少我什至没有看到一种实现方法,甚至可以覆盖某些方法。
结果,我要检查一下标签是否为空,并输入诸如"[[[EMPTYVALUE]]]"
这样您最终得到
<A>[[[EMPTYVALUE]]]</A>
然后生成您的XML,并在保存XML文件之前,将其转换为字符串,然后将"<A>[[[EMPTYVALUE]]]</A>"
替换为"<A></A>"
您可以在<A/>
上执行替换操作,但我认为创建一个更大的字符串进行替换比较安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.