C#System.Xml.Serialization - 仅使用而不使用

问题描述 投票:2回答:2

我的客户有一个奇怪的问题 - 我正在使用XmlSerializer读取XML文档(实际上是InfoPath文档),修改它,然后使用XmlSerializer写出XML文档,然后使用XmlTextWriter添加一些处理指令。一切正常,生成的文档实际上完全符合XML,并且可以由InfoPath读取。然而,在结构中发生的一个变化是原始文档具有以<A></A>形式写入的所有空标记,并且当我的文档被写入时,它变为<A/>。实际上由于XML标准完全相同。但是,我的客户(一家大公司)显然有一些带有硬编码的<A></A>的检查/验证脚本,但它们都失败了。他现在很沮丧,懒得改变他的剧本,并且想要<A></A>符号!我如何设置XmlTextWriter来做到这一点?

c# xml xml-serialization xmlserializer xmltextwriter
2个回答
5
投票

你可以通过提供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 codeXmlTextWriter.WriteEndElement,并推出一个更适合你的情况的版本。


0
投票

老实说,我认为如果您打算使用内置的Serializer,那么您最好不要进行查找/替换。它看起来不像你可以覆盖标签的实际形式,至少我没有看到一种方法,甚至覆盖一些方法。

结果我会检查一下,如果标签是空的,放入一个像"[[[EMPTYVALUE]]]"的值,所以你最终得到

<A>[[[EMPTYVALUE]]]</A>

然后生成您的XML,在保存XML文件之前,将其转换为字符串,并将"<A>[[[EMPTYVALUE]]]</A>"替换为"<A></A>"

您可以在<A/>上进行替换,但我认为创建一个更大的字符串来替换更安全。

© www.soinside.com 2019 - 2024. All rights reserved.