Question

Je souhaitais désérialiser un message XML contenant un élément pouvant être marqué nil = "true" dans une classe avec une propriété de type int? . La seule façon pour que cela fonctionne est d'écrire mon propre type NullableInt qui implémente IXmlSerializable . Y a-t-il une meilleure façon de le faire?

J'ai rédigé le problème dans son intégralité et décrit la façon dont je l'ai résolu sur mon blog .

Était-ce utile?

La solution

Je pense que vous devez préfixer le nil = "vrai". avec un espace de noms afin que XmlSerializer soit désérialisé à null.

MSDN sur 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"/>

Autres conseils

Mon correctif consiste à prétraiter les nœuds, en corrigeant les "nil". attributs:

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

J'associe ceci à une recherche récursive de nœuds enfants, de sorte que pour tout XmlNode (ou XmlDocument) donné, je puisse émettre un seul appel avant la désérialisation. Si vous souhaitez conserver la structure en mémoire d'origine non modifiée, utilisez un Clone () de XmlNode.

La façon paresseuse de le faire. C’est fragile pour un certain nombre de raisons, mais mon code XML est assez simple pour garantir une solution aussi rapide et compliquée.

xmlStr = Regex.Replace(xmlStr, "nil=\"true\"", "xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:nil=\"true\"");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top