从 C# 中的自定义数组项中删除 xsi:nil

Removing xsi:nil from custom array items in c#

我正在尝试创建一块 XML,大致如下所示:

<OuterTags>
  <MiddleTags>
    <Guests>
      <Adult />
      <Adult />
    </Guests>
  </MiddleTags>
</OuterTags>

不过。每当我尝试对此进行序列化时,我都会得到:

<OuterTags>
  <MiddleTags>
    <Guests>
      <Adult xsi:nil="true" />
      <Adult xsi:nil="true" />
    </Guests>
  </MiddleTags>
</OuterTags>

...我已经证明 xsi:nil="true" 属性被我的端点拒绝了。

我生成 MiddleTags 的代码目前存在于两个 类:

using System;
using System.Xml.Serialization;

namespace XmlRobot.DataTypes
{
  [Serializable]
  public class MiddleTags
  {
    [XmlArray("Guests")]
    [XmlArrayItem("Adult")]
    public Adult[] Adults { get; set; }
  }
}

...和...

using System;
using System.Xml.Serialization;

namespace XmlRobot.DataTypes
{
  [Serializable]
  public class Adult
  {
  }
}

我在这里找到了一个 question/answer (Suppress xsi:nil but still show Empty Element when Serializing in .Net),告诉我如何让这个标签对一个简单的元素起作用(即 string/float),但我做不到为了我的一生,让它为我的阵列工作!

有人有任何专业建议吗?

谢谢, 蒂姆

如果我们有这样的空引用数组:

var middle = new MiddleTags();
middle.Adults = new Adult[2];

然后在序列化期间:

var xs = new XmlSerializer(typeof(MiddleTags));
xs.Serialize(Console.Out, middle);

我们将得到:

<?xml version="1.0" encoding="cp866"?>
<MiddleTags xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Guests>
    <Adult xsi:nil="true" />
    <Adult xsi:nil="true" />
  </Guests>
</MiddleTags>

但是,如果我们填写 class:

的实例数组
middle.Adults[0] = new Adult();
middle.Adults[1] = new Adult();

那么我们将得到:

<?xml version="1.0" encoding="cp866"?>
<MiddleTags xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Guests>
    <Adult />
    <Adult />
  </Guests>
</MiddleTags>

因此,在序列化之前,我们可以简单地替换对 class:

实例的所有空引用
for (int i = 0; i < middle.Adults.Length; i++)
    if (middle.Adults[i] == null)
        middle.Adults[i] = new Adult();

这很简单,但很管用。怎么样?

当然,根据Adult的属性,这可能是不能接受的class。