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

时间:2015-10-13 19:26:36

标签: c# xml xml-serialization

我正在尝试创建一个看起来大致如下的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"属性。

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

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
  {
  }
}

我在这里找到了一个问题/答案(Suppress xsi:nil but still show Empty Element when Serializing in .Net)告诉我如何使这个标签适用于一个简单的元素(即字符串/浮点数),但我不能为我的生活做出贡献它适用于我的阵列!

有人有任何专业建议吗?

谢谢, 添

1 个答案:

答案 0 :(得分:1)

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

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>

但是,如果我们填写该类的实例数组:

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>

因此,在序列化之前,我们可以简单地将所有空引用替换为类的实例:

for (int i = 0; i < middle.Adults.Length; i++)
    if (middle.Adults[i] == null)
        middle.Adults[i] = new Adult();

这很简单,但确实有效。怎么样?

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