繁体   English   中英

C#System.Xml.Serialization-仅使用 <a></a> 永不

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM