【问题标题】:Render Empty XML Elements as Parent Elements将空 XML 元素呈现为父元素
【发布时间】:2010-12-23 09:09:59
【问题描述】:

我有一个奇怪的要求,即使用我的应用程序正在生成的某些 XML 的应用程序实际上需要将空元素序列化为父元素。例如:

<element foo="bar" />

应该是:

<element foo="bar"></element>

我不知道XmlSerializer 允许您更改此设置的任何方式。有谁知道如何做到这一点?

【问题讨论】:

  • 看起来有人推出了自己的 XML“解析”;)
  • 是的......这可能正是发生的事情。这很令人沮丧。
  • 如果你告诉他们“不”,并要求他们遵循国际标准而不是发明自己的标准,会发生什么?
  • 不幸的是,这是客户。我已经问过他们是否可以做任何事情来修复它,但显然它也不是他们可以控制的应用程序。

标签: c# xml-serialization


【解决方案1】:

我扩展了XmlTextWriter,以便我可以覆盖WriteEndElement() 方法,强制它调用WriteFullEndElement()。这成功了。

注意:任何看到我的问题更新的人,请忽略。 IE 以简写形式呈现 XML。当我在记事本中打开它时,我意识到一切正常。

public class FullEndingXmlTextWriter : XmlTextWriter
{
    public FullEndingXmlTextWriter(TextWriter w)
        : base(w)
    {
    }

    public FullEndingXmlTextWriter(Stream w, Encoding encoding)
        : base(w, encoding)
    {
    }

    public FullEndingXmlTextWriter(string fileName, Encoding encoding)
        : base(fileName, encoding)
    {
    }

    public override void WriteEndElement()
    {
        this.WriteFullEndElement();
    }
}

【讨论】:

    【解决方案2】:

    Scott Hanselman 不久前从 XML 中写了一篇关于 stripping out empty elements 的文章,乍一看,代码可以用于您的目的,只需对空元素的处理稍作改动。他还解释了为什么使用 RegEx 是一个坏主意。

    我指出这一点,因为我不知道如何让 XmlSerializer 做你想做的事。

    另一种可能性,虽然我不太了解 WPF 是使用 XAML 序列化程序 - 请查看 System.Window.Markup 命名空间文档。

    【讨论】:

    • 是的,看起来 Scott Hanselman 找到了一个很好且非常优化的解决方案(解决另一个问题),即使在这种情况下,如果速度不是主要问题,XSLT 转换可能会更容易.然而,我不同意他对 RegEx 的看法,而且显然他们已经使用了多年。 ;-)
    【解决方案3】:

    你可以用一个正则表达式来解决它,使它成为一个两遍的过程。

    string xml = "element foo=\"bar\" />"
    
    string pattern = @"<(?<elem>\w+)(?<body>\b.*)/>";
    string substitute =  @"<${elem} ${body}></${elem}>";
    
    Regex regex = new Regex(pattern);
    string goodresult = regex.Replace(xml, substitute);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2016-12-12
      相关资源
      最近更新 更多