Avatar billede iakob Nybegynder
08. juli 2004 - 10:09 Der er 6 kommentarer og
1 løsning

Serializering, At springe et niveau over

Mine klasser ser således ud:

[XmlRoot("Definitions")]
public class Monster
{
public HD HD;
}

public class HD
{
public string HP
}

Det giver følgende XML:
<Monster>
<HD><HP>1D6+3</HP></HD>
</Monster>

Men jeg vil gerne at det ser således ud:
<Monster>
<HD>1D6+3</HD>
</Monster>

Hvordan gør jeg det?
Avatar billede iakob Nybegynder
08. juli 2004 - 10:09 #1
[XmlRoot("Definitions")] skulle være [XmlRoot("Monster")]
Avatar billede arne_v Ekspert
08. juli 2004 - 10:36 #2
Både i dette spørgsmål og i dit andet spørgsmål vil jeg finde det meget fristende at bruge XSL til at konvertere fra "forkert" XML til "rigtig" XML.
Avatar billede iakob Nybegynder
08. juli 2004 - 11:29 #3
Det er meget muligt, men nu har jeg altså valgt at bruge serialiserings-mekanismen i dotnet (c#). I øvrigt har jeg endnu mindre forstand på XSL end XML og det ville afføde cirka en million spørgsmål (hm... er du ude på at tjene flere points? ;-)
Avatar billede arne_v Ekspert
08. juli 2004 - 19:20 #4
Så svært er det heller ikke.

Her er et eksempel:

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

public class C1
{
    public C2 c2;
}

public class C2
{
    public string s;
}

class MainClass
{
    private static void standard(C1 c1)
    {
        Console.WriteLine("Standard:");
        XmlSerializer ser = new XmlSerializer(typeof(C1));
        ser.Serialize(Console.Out, c1);
        Console.WriteLine();
    }
    private static void transformed(C1 c1)
    {
        Console.WriteLine("Transformed:");
        XmlSerializer ser = new XmlSerializer(typeof(C1));
        StringWriter sw = new StringWriter();
        ser.Serialize(sw, c1);
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(sw.ToString());
        XslTransform xslt = new XslTransform();
        xslt.Load("C:\\C1.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)
    {
        C1 c1 = new C1();
        c1.c2 = new C2();
        c1.c2.s = "test";
        standard(c1);
        transformed(c1);
    }
}

C1.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="C1">
<C1>
<xsl:apply-templates/>
</C1>
</xsl:template>

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

</xsl:template>
<xsl:template match="s">
<xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

Output ser ud som:

Standard:
<?xml version="1.0" encoding="IBM437"?>
<C1 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <c2>
    <s>test</s>
  </c2>
</C1>
Transformed:
<C1>
  <c2>test</c2>
</C1>

hvor vi ser at <s></s> er forsvundet.
Avatar billede iakob Nybegynder
09. juli 2004 - 08:40 #5
Hm... det var ikke det jeg spurgte om. Har du ikke et svar med de der firkantede tags [XML...]?
Avatar billede arne_v Ekspert
09. juli 2004 - 09:00 #6
Du kan selv checke i docs "Attributes That Control XML Serialization" hvad du
kan. Jeg kan ikke se noget der kan bruges.

Hvis du vil have 100% kontrol over dit XML output, så tror jeg at XSL er
løsningen.
Avatar billede wisen Nybegynder
17. juli 2004 - 12:43 #7
.. prøv at se mit svar på spg: http://www.eksperten.dk/spm/517893
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