Avatar billede davidfossil Nybegynder
13. oktober 2005 - 22:35 Der er 4 kommentarer og
1 løsning

XmlSerialize - tvinge en property til at gemme som CDATA

Jeg har en klasse som er markeret med [XmlRoot] og derfor kan serialiseres til XML. Klassen definerer en række properties, bl.a. en som skal indeholde noget HTML-kode (string). Når et objekt af klassen serialiseres og jeg gemmer mit XML-output til en fil, kan jeg se at HTML-koden er fint enkodet, så < bliver til &lt; osv.

Dette er jo sådan set også glimrende, og det virker helt efter hensigten. Min forfængelighed ville dog foretrække om HTML-koden kunne blive som den var, blot omsluttet af et CDATA element. Er der nogen måde jeg kan tvinge XmlSerializer til serialisere den ene property anderledes end de øvrige?
Avatar billede davidfossil Nybegynder
13. oktober 2005 - 22:51 #1
Det ser ud til at svaret er, at det ikke kan lade sig gøre:
http://www.dotnet247.com/247reference/msgs/30/150605.aspx

Lader dog lige tråden stå åben lidt... :)
Avatar billede arne_v Ekspert
13. oktober 2005 - 23:57 #2
umuligt og umuligt

prøv at kør dette program og se om det giver nogle gode ideer:

using System;
using System.IO;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;

namespace E
{
    public class Data1
    {
        private string s;
        public String S
        {
            get
            {
                return s;
            }
            set
            {
                s = value;
            }
        }
    }
    public class Data2 : IXmlSerializable
    {
        private string s;
        public String S
        {
            get
            {
                return s;
            }
            set
            {
                s = value;
            }
        }
        public XmlSchema GetSchema()
        {
            return null;   
        }
        public void ReadXml(XmlReader rdr)
        {
            s = rdr.ReadElementString();
        }
        public void WriteXml(XmlWriter wrt)
        {
            wrt.WriteStartElement("S");
            wrt.WriteCData(s);
            wrt.WriteEndElement();
        }
    }
    public class TestClass
    {
        public static void Main(string[] args)
        {
            // traditional
            Data1 d1 = new Data1();
            d1.S = "<tag>text</tag>";
            Console.WriteLine(d1.S);
            XmlSerializer ser1 = new XmlSerializer(typeof(Data1));
            StringWriter sw1 = new StringWriter();
            ser1.Serialize(sw1, d1);
            String s1 = sw1.ToString();
            Console.WriteLine(s1);
            StringReader sr1 = new StringReader(s1);
            Data1 d1x = (Data1)ser1.Deserialize(sr1);
            Console.WriteLine(d1x.S);
            // custom
            Data2 d2 = new Data2();
            d2.S = "<tag>text</tag>";
            Console.WriteLine(d2.S);
            XmlSerializer ser2 = new XmlSerializer(typeof(Data2));
            StringWriter sw2 = new StringWriter();
            ser2.Serialize(sw2, d2);
            String s2 = sw2.ToString();
            Console.WriteLine(s2);
            StringReader sr2 = new StringReader(s2);
            Data2 d2x = (Data2)ser2.Deserialize(sr2);
            Console.WriteLine(d2x.S);
        }
    }
}
Avatar billede arne_v Ekspert
04. november 2005 - 19:16 #3
har du fået prøvet ?
Avatar billede davidfossil Nybegynder
22. marts 2006 - 10:27 #4
arne: Beklager jeg aldrig fik svaret tilbage her. Lige pludselig er der sytten andre ting der haster mere. Smider du ikke et svar? Dit kodeeksempel løser sådan set problemstillingen, men jeg vælger i dette tilfælde at holde mig til den mere enkle løsning uden cdata. Havde håbet på at jeg kunne skrive noget lignende [CDataProperty()] foran den pågældende property, men så let skulle det ikke være denne gang.
Avatar billede arne_v Ekspert
22. marts 2006 - 13:11 #5
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester