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. P>
Le résultat que je cherche est-ce: P> pour le produire, j'utilise cet objet: p> Lorsque vous utilisez l'annotation xmltext sur la propriété de valeur, l'erreur suivante est lancée. . P> 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 p>
BlockQuote> 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: p> Quelqu'un peut-il me dire dans la bonne direction pour que cela fonctionne pour que cela fonctionne. P> Merci, Adam P> P>
5 Réponses :
La manière dont Mais vous voulez sérialiser certaines données de texte en tant que section CDATA. P>
Donc, tout d'abord, le type de 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.) P>
Vous pouvez bien sûr implémenter ixmlSerializable et simplement code la sérialisation du type Code> Test Code> qui vous donne un contrôle complet. P> test code> est défini, vos données sont un objet CDATA. Donc, le système de sérialisation essaie de préserver l'objet CDATA. P>
test.value code> devrait être une chaîne. P>
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"); } }
il lance a.cdatafield ne peut pas être sérialisé car il n'a pas d'erreur de constructeur sans paramètre de code>
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: code: p>
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; }
Que se passe-t-il si vous supprimez
[xmltext] code>?