8
votes

XML Serialization - XMLCDataSection en sérialisement.xmltext

J'ai des problèmes sérialisés une section CDATA à l'aide de C #

J'ai besoin de sérialiser la propriété d'objet XMLCDataSection comme l'Innertext de l'élément.

Le résultat que je cherche est-ce: xxx

pour le produire, j'utilise cet objet: xxx

Lorsque vous utilisez l'annotation xmltext sur la propriété de valeur, l'erreur suivante est lancée. .

système.invalidoperationException: Il y avait une erreur reflétant la propriété 'valeur'. ---> Système.InvalidoperationException: Ne peut pas sérialiser la valeur de membre de Tapez system.xml.xmlcdataSection. Xmlattribute / xmltext ne peut pas être utilisé pour Encodé des types complexes

Si je commencez l'annotation, la sérieisation fonctionnera mais la section CDATA est placée dans un élément de valeur qui n'est pas bon pour ce que j'essaie de faire: xxx

Quelqu'un peut-il me dire dans la bonne direction pour que cela fonctionne pour que cela fonctionne.

Merci, Adam


1 commentaires

Que se passe-t-il si vous supprimez [xmltext] ?


5 Réponses :


2
votes

La manière dont test est défini, vos données sont un objet CDATA. Donc, le système de sérialisation essaie de préserver l'objet CDATA.

Mais vous voulez sérialiser certaines données de texte en tant que section CDATA.

Donc, tout d'abord, le type de test.value devrait être une chaîne.

Vous devez ensuite contrôler comment ce champ est sérialisé, mais il ne semble pas y avoir de méthode intégrée ni d'attribut pour contrôler la manière dont les chaînes sont sérialisées (en tant que chaîne, peut-être avec des entités pour des caractères réservés, ou comme CDATA). (Depuis, d'une perspective Infoset XML, tous sont les mêmes, ce n'est pas surprenant.)

Vous pouvez bien sûr implémenter ixmlSerializable et simplement code la sérialisation du type Test qui vous donne un contrôle complet.


0 commentaires

5
votes

Merci Richard, seulement maintenant eu la chance de revenir à cela. Je pense avoir résolu le problème en utilisant votre suggestion. J'ai créé un objet CDAtafield en utilisant les éléments suivants:

public class CDataField : IXmlSerializable
    {
        private string elementName;
        private string elementValue;

        public CDataField(string elementName, string elementValue)
        {
            this.elementName = elementName;
            this.elementValue = elementValue;
        }

        public XmlSchema GetSchema()
        {
            return null;
        }

        public void WriteXml(XmlWriter w)
        {
            w.WriteStartElement(this.elementName);
            w.WriteCData(this.elementValue);
            w.WriteEndElement();
        }

        public void ReadXml(XmlReader r)
        {                      
            throw new NotImplementedException("This method has not been implemented");
        }
    }


1 commentaires

il lance a.cdatafield ne peut pas être sérialisé car il n'a pas d'erreur de constructeur sans paramètre



0
votes

J'ai eu un même problème que Adam. Cependant, cette réponse ne m'a pas aidé à 100% :) mais me donne un indice. Donc, j'ai créé un code comme ci-dessous. Il génère des xml comme ceci: xxx

code: xxx


0 commentaires

1
votes

Il suffit de trouver une alternative de ici : xxx


0 commentaires

1
votes

Cette version essentiellement plus courte de Jack Réponse avec de meilleurs messages d'erreur:

[XmlIgnore]
public string Content { get; set; }

[XmlText]
public XmlNode[] ContentAsCData
{
    get => new[] { new XmlDocument().CreateCDataSection(Content) };
    set => Content = value?.Cast<XmlCDataSection>()?.Single()?.Data;
}


0 commentaires