我的客户有一个奇怪的问题 - 我正在使用XmlSerializer
读取XML文档(实际上是InfoPath文档),修改它,然后使用XmlSerializer
写出XML文档,然后使用XmlTextWriter
添加一些处理指令。一切正常,生成的文档实际上完全符合XML,并且可以由InfoPath读取。然而,在结构中发生的一个变化是原始文档具有以<A></A>
形式写入的所有空标记,并且当我的文档被写入时,它变为<A/>
。实际上由于XML标准完全相同。但是,我的客户(一家大公司)显然有一些带有硬编码的<A></A>
的检查/验证脚本,但它们都失败了。他现在很沮丧,懒得改变他的剧本,并且想要<A></A>
符号!我如何设置XmlTextWriter
来做到这一点?
你可以通过提供XmlSerializer
与你自己的XmlWriter
后代,这将覆盖WriteEndElement
method。默认情况下,此方法根据要输出的元素的内容生成空元素(<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
版本,但原则上应该很容易实现如上所述。我建议你查看the source code的XmlTextWriter.WriteEndElement
,并推出一个更适合你的情况的版本。
老实说,我认为如果您打算使用内置的Serializer,那么您最好不要进行查找/替换。它看起来不像你可以覆盖标签的实际形式,至少我没有看到一种方法,甚至覆盖一些方法。
结果我会检查一下,如果标签是空的,放入一个像"[[[EMPTYVALUE]]]"
的值,所以你最终得到
<A>[[[EMPTYVALUE]]]</A>
然后生成您的XML,在保存XML文件之前,将其转换为字符串,并将"<A>[[[EMPTYVALUE]]]</A>"
替换为"<A></A>"
您可以在<A/>
上进行替换,但我认为创建一个更大的字符串来替换更安全。