Avatar billede iakob Nybegynder
08. juli 2004 - 09:33 Der er 6 kommentarer og
2 løsninger

Serializering, At få både xmlelement og xmlattribut på een gang

Jeg har en klasse (monster) som har en assoricering til en anden klasse (Stat). Altså således:

public class Monster
{
[XmlIgnore]
public Stat Strength;
[XmlIgnore]
public Stat Dexterity;
[XmlIgnore]
public Stat Constitution;
}

Nu vil jeg gerne udstyre min klasse med Xml serialisering. Dvs erstatte [XmlIgnore] med tags der gør således:

<Monster>
<Stat name="Strength">10</Stat>
<Stat name="Dexterity">10</Stat>
<Stat name="Constitution">10</Stat>
</Monster>

Men uden at tilføje flere attributter i min klasse. Hvordan gør jeg det?
Avatar billede arne_v Ekspert
08. juli 2004 - 19:31 #1
Endnu en gang XSL:

using System;
using System.IO;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.Serialization;

public class C3
{
    public string f1;
    public string f2;
    public string f3;
}

class MainClass
{
    private static void standard(C3 c3)
    {
        Console.WriteLine("Standard:");
        XmlSerializer ser = new XmlSerializer(typeof(C3));
        ser.Serialize(Console.Out, c3);
        Console.WriteLine();
    }
    private static void transformed(C3 c3)
    {
        Console.WriteLine("Transformed:");
        XmlSerializer ser = new XmlSerializer(typeof(C3));
        StringWriter sw = new StringWriter();
        ser.Serialize(sw, c3);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(sw.ToString());
        XslTransform xslt = new XslTransform();
        xslt.Load("C:\\C3.xsl");
        XmlTextWriter wrt = new XmlTextWriter(Console.Out);
        wrt.Formatting = Formatting.Indented;
        xslt.Transform(doc, null, wrt, null);
        Console.WriteLine();
    }
    public static void Main(string[] args)
    {
        C3 c3 = new C3();
        c3.f1 = "a";
        c3.f2 = "bb";
        c3.f3 = "ccc";
        standard(c3);
        transformed(c3);
    }
}

C3.xsl indeholder:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/">
<xsl:apply-templates/>
</xsl:template>

<xsl:template match="C3">
<C3>
<xsl:apply-templates/>
</C3>
</xsl:template>

<xsl:template match="f1">
<x key="f1"><xsl:value-of select="."/></x>
</xsl:template>

<xsl:template match="f2">
<x key="f2"><xsl:value-of select="."/></x>
</xsl:template>

<xsl:template match="f3">
<x key="f3"><xsl:value-of select="."/></x>
</xsl:template>

</xsl:stylesheet>

Output bliver:

Standard:
<?xml version="1.0" encoding="IBM437"?>
<C3 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <f1>a</f1>
  <f2>bb</f2>
  <f3>ccc</f3>
</C3>
Transformed:
<C3>
  <x key="f1">a</x>
  <x key="f2">bb</x>
  <x key="f3">ccc</x>
</C3>
Avatar billede iakob Nybegynder
09. juli 2004 - 08:41 #2
Tak for svaret, men jeg har allerede lavet en masse kode med [XML]-tags. Det vil jeg gerne arbejde videre på
Avatar billede wisen Nybegynder
17. juli 2004 - 12:42 #3
.. prøv at lave noget i stil med :

public class Stat
{
  [XmlAttribute]
  public int stat;
}

public class Monster
{
  public Stat Strength;
  public Stat Dexterity;
  public Stat Constitution;
}

... det giver en serialisering der ser nogenlunde således ud :

<Monster>
  <Strength stat="10" />
  <Dexterity stat="10" />
  <Constitution stat="10" />
</Monster>
Avatar billede arne_v Ekspert
25. juli 2004 - 22:11 #4
Det var vel ikke det ønskede output ??
Avatar billede wisen Nybegynder
26. juli 2004 - 08:16 #5
arne_v >> Nej, ikke helt - men det er det tætteste man kan komme på ved brug at attributter - ellers skal man jo til at lave egen serialisering...
Avatar billede arne_v Ekspert
26. juli 2004 - 08:19 #6
Eller transformere som jeg foreslår.
Avatar billede wisen Nybegynder
26. juli 2004 - 09:10 #7
Ja, men det er meget kode man ikke får ret meget ud af - der skal vist være en rigtigt go' grund til at man skulle gøre det...
Avatar billede arne_v Ekspert
27. juli 2004 - 10:58 #8
Hvis man vil have XML'en præcis som man vil have det, så tror jeg at det er løsningen.
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