我想将包含可以标记为nil="true"
的元素的XML消息反序列化为具有类型int?
的属性的类。我能够让它工作的唯一方法是编写我自己的NullableInt
类型来实现IXmlSerializable
。有没有更好的方法呢?
我写了完整的问题以及我解决它的方式on my blog。
答案 0 :(得分:6)
我认为您需要在命名空间前加上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"/>
答案 1 :(得分:3)
我的修复方法是预处理节点,修复任何“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()。
答案 2 :(得分:0)
这种非常懒惰的方式。它的脆弱性有很多原因,但我的XML很简单,可以保证这么快速和肮脏的修复。
xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");