.Net XmlSerializer: désérialiser CDATA être intérieure du texte
J'ai un problème avec CDATA désérialisation en utilisant la norme .Net XmlSerializer.
Mise à jour: - je obtenir XML à partir d'un système externe et je ne peux pas influencer son format donc je ne peux pas faire CData être inclus dans un Élément séparé de l'Attribut.
Sérialisation donne ça:
<?xml version="1.0" encoding="utf-16"?>
<MyClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><![CDATA[Hello, world!]]></MyClass>
Désérialisation ne pas restaurer l'objet à son état d'origine.
Voici la classe qui est en train d'être sérialisé:
public class MyClass
{
string _data;
[XmlIgnore]
public string Data
{
get { return _data; }
set { _data = value; }
}
[XmlAnyElement]
public XmlCDataSection CData
{
get { return new XmlDataDocument().CreateCDataSection(Data); }
set { Data = value.Value; }
}
}
Voici le test qui échoue:
[Test]
public void CData_as_inner_text_test()
{
MyClass item = new MyClass();
item.Data = "Hello, world!";
XmlSerializer serializer = new XmlSerializer(item.GetType());
string serialized;
using (StringWriter sw = new StringWriter())
{
serializer.Serialize(sw, item);
serialized = sw.GetStringBuilder().ToString();
}
MyClass deserialized;
using (StringReader sr = new StringReader(serialized))
{
deserialized = (MyClass)serializer.Deserialize(sr);
}
Assert.AreEqual(item.Data, deserialized.Data); //For some reason, deserialized.Data == null
}
J'ai trouvé le même problème ici, mais il n'y a pas de réponse:
XmlSerializer, XmlAnyElement et CDATA
Vous devez vous connecter pour publier un commentaire.
La CData bien finit nulle, parce que le contenu de la section CDATA se retrouve dans les Données de la propriété, où il est ignoré...
est absolument équivalent à:
Vous ne devriez pas vous préoccuper de savoir si le app externe écrit le contenu de MyClass comme CData ou pas. De même, l'app externe ne se soucient pas comment vous l'écrire.
OIE, ce devrait être tout ce dont vous avez besoin:
<MyClass><![CDATA[Hello, world!]]></MyClass>
est exactement le même que pour<MyClass>Hello, world!</MyClass>
- si vous comptez sur la CDATA il n'y en aucune façon, vous êtes en train de lire XML tout faux 🙂D'abord déclarer une propriété comme XmlCDataSection
dans ce cas projectXml est une chaîne de caractères xml
lors de la sérialisation de votre message, vous aurez votre joli format (avis )