我想反序列化包含一个元素的 XML 消息,该元素可以标记nil="true"
为具有 type 属性的类int?
。我可以让它工作的唯一方法是编写我自己的NullableInt
类型来实现IXmlSerializable
. 有更好的方法吗?
我在博客上写了完整的问题和解决方法。
我想反序列化包含一个元素的 XML 消息,该元素可以标记nil="true"
为具有 type 属性的类int?
。我可以让它工作的唯一方法是编写我自己的NullableInt
类型来实现IXmlSerializable
. 有更好的方法吗?
我在博客上写了完整的问题和解决方法。
我认为您需要在 nil="true" 前面加上一个命名空间,以便 XmlSerializer 反序列化为 null。
<?xml version="1.0" encoding="UTF-8"?>
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="array">
<entity>
<id xsi:type="integer">1</id>
<name>Foo</name>
<parent-id xsi:type="integer" xsi:nil="true"/>
我的解决方法是预处理节点,修复任何“nil”属性:
public static void FixNilAttributeName(this XmlNode @this)
{
XmlAttribute nilAttribute = @this.Attributes["nil"];
if (nilAttribute == null)
{
return;
}
XmlAttribute newNil = @this.OwnerDocument.CreateAttribute("xsi", "nil", "http://www.w3.org/2001/XMLSchema-instance");
newNil.Value = nilAttribute.Value;
@this.Attributes.Remove(nilAttribute);
@this.Attributes.Append(newNil);
}
我将此与对子节点的递归搜索相结合,因此对于任何给定的 XmlNode(或 XmlDocument),我可以在反序列化之前发出单个调用。如果您想保持原始内存结构不变,请使用 XmlNode 的 Clone()。
非常懒惰的方式来做到这一点。由于多种原因,它很脆弱,但我的 XML 足够简单,足以保证进行如此快速而肮脏的修复。
xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");