从 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。
我正在尝试创建一块 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。