Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dynamisches benennen von XML(ElementName)
Bradley
myCSharp.de - Member



Dabei seit:
Beiträge: 155

Themenstarter:

Dynamisches benennen von XML(ElementName)

beantworten | zitieren | melden

Hallo,

ich versuche eine XML zu Serialisieren, das RootElement der XML will ich einen XMLElement(Element= ...) einsetzten.

Die Frage ist, ob ich den Namen des Element dynamisch erzeugen kann. Zum Beispiel durch ein Feld der Klasse oder ein Property?

Danke für die Hilfe.
private Nachricht | Beiträge des Benutzers
ThomasE.
myCSharp.de - Member



Dabei seit:
Beiträge: 453

beantworten | zitieren | melden

Hallo,

also ist im Endeffekt die Frage, ob du Daten-Klassenobjekte in Xml-Dateien speichern kannst?

Wenn dann das hier: Xml-Serializer

Außer die frage ist spezifiischer, kann man allerdings nicht wirklich rauslesen. Im Grunde ist dein Vorgehen unter Anderem mit Reflection möglich.
Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen...
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Da du von XElement redest, gehe ich mal von Linq to XML aus.

(Vorab: ThomasE.s Hinweis mit dem XmlSerializer ist - meistens - die bessere Variante.)

Natürlich kann man die Name-Eigenschaft einer XElement-Instanz zur Laufzeit (= dynamisch) ändern.


class ExampleClass
{
    public bool ExampleProperty { get; set; }

    public void SaveAsXml(string path)
    {
        new XDocument(
            new XDeclaration("1.0", "UTF-8", "true"), 
            new XElement(GetType().Name, 
                new XAttribute("referenceId", GetHashCode()),
                new XElement(nameof(ExampleProperty), ExampleProperty)
            )
        )
        .Save(path);
    }
}

Wobei ich irgendwie vermute, dass das nicht deine Frage war, aber mangels Glaskugel...

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Bradley
myCSharp.de - Member



Dabei seit:
Beiträge: 155

Themenstarter:

beantworten | zitieren | melden

Okay ich sehe ein das ich zu wenig Infos gegeben habe.
Ich verwende die XML Serialisierung.
Als beispiel folgende Klasse:

        public class TEST
        {
            [XmlElement(ElementName = "test")]
            public int ID { get; set; }
            public string Titel { get; set; }
            public string Text { get; set; }
        }

Was ich mir jetzt machen möchte, wäre beim/vor dem Serialiesieren den ElementName durch einen beliebigen String auszutauschen.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Bradley am .
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Nein, nicht mit dem XmlSerializer. Nicht ohne weiteres, siehe unten.

XmlSerializer und die XmlElementAttribute-Klasse arbeiten so zusammen, dass verschiedene Instanzen einer Klasse nach der Serialisierung ein und demselben XML-Schema entsprechen. Das heisst, die Tatsache, dass die XML-Knoten immer gleich heißen, ist absolut erwünscht.

Was meine ich mit "nicht ohne weiteres"? Naja, einen kleinen, etwas unsauberen Kniff gibt es.
Lass das XmlElementAttribute weg und abonnier das UnknownElement-Ereignis des von dir verwendeten XmlSerializers. Dann kannst du die Serialisierung/Deserialisierung noch beeinflussen.

Besser wäre ein eigener Serializer für solche Fälle. Das klingt auch nur nach großem Aufwand, so schlimm ist das nicht. (EDIT: das Stück Code eben ist ja an sich schon der (naive) Ansatz für einen Serializer)

LaTino
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LaTino am .
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


Dabei seit:
Beiträge: 862
Herkunft: Oerlinghausen/NRW

beantworten | zitieren | melden

@LaTino
Meines wissens wird das UnknownElement nur bei der deserialisierung aufgerufen.

@Bradley
Um das erwünschte verhalten mit dem XmlSerializer zu bewerkstelligen fällt mir auf anhieb nur eine modifizierte eigene Version eines XmlWriters ein.

aber warum nur sollte man soetwas tun?
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden

Eine weitere Möglichkeit ist in der Klasse das Interface IXmlSerializable zu implementieren.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3062
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von unconnected
@LaTino
Meines wissens wird das UnknownElement nur bei der deserialisierung aufgerufen.

Stimmt, dann hat sich das auch erledigt. Ich scheitere auch etwas dran, mir auszumalen, wofür das gut sein könnte. Wenn ich so einen Knoten mit variablem Namen in mein XML schreibe, wie zum Teufel soll ich dann beim Deserialisieren rausfinden, in welche Klasse ich deserialisiere?

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Deaktiviertes Profil
myCSharp.de - Member



Dabei seit:
Beiträge: 996

beantworten | zitieren | melden


@LaTino

Sieht ja danach aus, als ob der TE dieses XML an sonstwen schicken muss. Also ist das Deserialisieren das Problem eines Anderen.

Wenn der das so haben will, dann weiß der wohl auch wie er das wieder auseinander bekommt
private Nachricht | Beiträge des Benutzers

Moderationshinweis von MrSparkle (26.06.2017 - 14:21:02):

Solange der OP seine Anforderungen nicht weiter spezifiziert, brauchen wir nicht weiter darüber zu spekulieren.