Laden...

Dynamisches benennen von XML(ElementName)

Erstellt von Bradley vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.029 Views
B
Bradley Themenstarter:in
153 Beiträge seit 2014
vor 6 Jahren
Dynamisches benennen von XML(ElementName)

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.

[Space Opera Blog](http://bradley-software.blogspot.com/)
[Space Opera Forum](http://forum.bradley-labs.de/)
T
461 Beiträge seit 2013
vor 6 Jahren

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... 😄

3.003 Beiträge seit 2006
vor 6 Jahren

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)

B
Bradley Themenstarter:in
153 Beiträge seit 2014
vor 6 Jahren

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.

[Space Opera Blog](http://bradley-software.blogspot.com/)
[Space Opera Forum](http://forum.bradley-labs.de/)
3.003 Beiträge seit 2006
vor 6 Jahren

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

"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)

849 Beiträge seit 2006
vor 6 Jahren

@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?

D
985 Beiträge seit 2014
vor 6 Jahren

Eine weitere Möglichkeit ist in der Klasse das Interface IXmlSerializable zu implementieren.

3.003 Beiträge seit 2006
vor 6 Jahren

@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)

D
985 Beiträge seit 2014
vor 6 Jahren

@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 😁

Hinweis von MrSparkle vor 6 Jahren

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