8

我想反序列化包含一个元素的 XML 消息,该元素可以标记nil="true"为具有 type 属性的类int?。我可以让它工作的唯一方法是编写我自己的NullableInt类型来实现IXmlSerializable. 有更好的方法吗?

我在博客上写了完整的问题和解决方法。

4

3 回答 3

6

我认为您需要在 nil="true" 前面加上一个命名空间,以便 XmlSerializer 反序列化为 null。

xsi:nil 上的 MSDN

<?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"/>
于 2008-11-20T21:49:18.617 回答
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()。

于 2009-10-16T21:17:54.547 回答
0

非常懒惰的方式来做到这一点。由于多种原因,它很脆弱,但我的 XML 足够简单,足以保证进行如此快速而肮脏的修复。

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");
于 2011-01-29T10:02:22.437 回答