Frage

Ich wollte eine XML-Nachricht deserialisiert ein Element enthält, das nil="true" in eine Klasse mit einer Eigenschaft des Typs int? markiert werden können. Die einzige Art, wie ich es an der Arbeit konnte, war meine eigene NullableInt Art zu schreiben, die IXmlSerializable implementiert. Gibt es einen besseren Weg, es zu tun?

Ich schrieb das volle Problem und die Art, wie ich es gelöst auf meinem Blog .

War es hilfreich?

Lösung

Ich glaube, Sie brauchen die nil = „true“ mit einem Namespace, um das Präfix für XmlSerializer auf null deserialise.

MSDN auf xsi: nil

<?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"/>

Andere Tipps

Meine Lösung ist, vorverarbeitet, um die Knoten, keine „Null“ fixing Attribute:

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);
}

ich dieses Paar mit einer rekursiven Suche nach untergeordneten Knoten, so dass für jede gegebene XmlNode (oder XmlDocument), habe ich einen einzigen Anruf vor Deserialisierung ausgeben kann. Wenn Sie das Original in-Speicherstruktur unverändert, arbeiten mit einem Klon () des XmlNode behalten wollen.

Der außerordentlich faul Weg, es zu tun. Es ist zerbrechlich für eine Reihe von Gründen, aber meine XML ist einfach genug, eine solche schnelle und schmutzige Lösung zu gewährleisten.

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top