【问题标题】:C# System.Xml.Serialization - use only <a></a> and never <a/>C# System.Xml.Serialization - 仅使用 <a></a> 而从不使用 <a/>
【发布时间】:2019-03-05 09:28:50
【问题描述】:

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

【问题讨论】:

  • 请提供小代码示例来说明问题,我们可以重现它。
  • 我认为 Net 库确实符合 XML 规范。它认为 InfoPath 不符合要求。
  • .NET 和 Infopath 都符合 - 我的客户自己的验证脚本不符合。

标签: c# xml xml-serialization xmlserializer xmltextwriter


【解决方案1】:

您可以通过为XmlSerializer 提供您自己的XmlWriter 后代来做到这一点,这将覆盖WriteEndElement method。默认情况下,此方法根据输出元素的内容生成一个空元素 (&lt;a /&gt;) 或一个关闭元素 (&lt;/a&gt;)。您可以更改行为以始终生成完整的关闭元素。

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 并推导出更适合您的情况的版本。

【讨论】:

  • XmlTextWriter 不会覆盖 WriteEndElementAsync,(并且 XmlWriter 的实现只是抛出异常),所以我认为这段代码可能就足够了?
  • 刚刚接管了解决方案 - 按需要工作!然而,一个问题 - 现在它在一个新的换行符中下降。有什么办法控制吗?
  • @PetrOsipov 查看XmlWriterSettings,它提供了一系列可能有助于进一步格式化输出的设置。
  • 实际上,没有任何设置可以控制它。至少,没有一个能带来预期的效果。我现在正试图覆盖 WriteFullEndElement。虽然它是可覆盖的,但我不能只使用官方类库并修复我想要的 - 使用了无数内部、私有或受保护的字段等,这使得修复功能变得不容易......
【解决方案2】:

老实说,我认为如果您要使用内置的序列化程序,那么您最好进行查找/替换。看起来你不能覆盖标签的实际形式,至少我还没有看到一种方法来做到这一点,甚至覆盖一些方法。

因此,我会检查一下,如果标签为空,则输入一个值,例如 "[[[EMPTYVALUE]]]",这样你最终会得到

&lt;A&gt;[[[EMPTYVALUE]]]&lt;/A&gt;

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

你可以在 &lt;A/&gt; 上做一个替换,但我认为创建一个更大的字符串来替换更安全。

【讨论】:

    猜你喜欢
    • 2020-08-22
    • 2018-11-22
    • 1970-01-01
    • 2018-09-10
    • 2019-06-04
    • 1970-01-01
    • 2018-08-11
    • 2011-08-01
    • 1970-01-01
    相关资源
    最近更新 更多