我正在尝试创建一个看起来大致如下的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)告诉我如何使这个标签适用于一个简单的元素(即字符串/浮点数),但我不能为我的生活做出贡献它适用于我的阵列!
有人有任何专业建议吗?
谢谢, 添
答案 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类的属性,这可能是不可接受的。