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
XmlSerializer und Key Value Liste
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


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

Themenstarter:

XmlSerializer und Key Value Liste

beantworten | zitieren | melden

Hallo,

ich habe hier ein Xml womit der XmlSerializer out of the Box nicht zurecht kommt.

<Data>
    <Liste>
         <Key1>Daten</Key1>
         <Key2>andere Daten</Key2>
         <KeyN>ganz andere Daten</KeyN>
         <Mopped>Irgendwelche Daten</Mopped>
    </Liste>
</Data>

Ich würde jetzt entweder zu IXmlSerializable Schnittstelle oder zu XDocument greifen.

Gibt es eine schöne Art dieses Xml in eine Vernünftige Object Struktur (also mit dem XmlSerializer) zu bringen alla


public class Data
{
public List<KeyValuePair> Liste {get;set;}
}

wobei die Object Struktur ersteinmal Wurst ist, ich suche nur nach einem schönen Weg dieses Key Value Pair Szenario zu lösen.

Würde mich über ein paar Stichwörter freuen :)
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von unconnected am .
private Nachricht | Beiträge des Benutzers
ironnie
myCSharp.de - Member



Dabei seit:
Beiträge: 42

beantworten | zitieren | melden

Erstelle doch erstmal eine serialisierbare Klasse, die ein Dictionary beinhält, die deinen Vorstellungen entspricht.

Nachdem du das Objekt zum ersten Mal serialisiert hast, hast du erstens eine Vorlage wie ein serialisiertes Dictionary aussieht, weiters solltest du das File wieder problemlos einlesen können.

LG
programmers do confuse halloween with christmas, because OCT 31 == DEC 25.
private Nachricht | Beiträge des Benutzers
Sarc
myCSharp.de - Member



Dabei seit:
Beiträge: 426

beantworten | zitieren | melden

Hi,

hier eine Möglichkeit in Anlehnung an https://gist.github.com/refractalize/1751260:

class Program
{
	static void Main(string[] args)
	{
		var xml = "<Data><Liste><Key1>Daten</Key1><Key2>andere Daten</Key2><KeyN>ganz andere Daten</KeyN><Mopped>Irgendwelche Daten</Mopped></Liste></Data>";
		var ser = new XmlSerializer(typeof(Data));
		var d = (Data)ser.Deserialize(new StringReader(xml));
	}
}

[XmlRoot("Data")]
public class Data
{
	[XmlElement("Liste")]
	public Liste List { get; set; }

	public class Liste
	{
		[XmlIgnore]
		public Dictionary<string, string> Properties = new Dictionary<string, string>();

		[XmlAnyElement]
		public XElement[] XmlProperties
		{
			get
			{
				return Properties.Select(entry => new XElement(entry.Key, entry.Value)).ToArray();
			}
			set
			{
				Properties = value.ToDictionary(el => el.Name.LocalName, el => el.Value);
			}
		}
	}
}
private Nachricht | Beiträge des Benutzers
unconnected
myCSharp.de - Member

Avatar #avatar-3200.jpg


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

Themenstarter:

beantworten | zitieren | melden

@ironnie

Leider habe ich auf die XmlStruktur keinen Einfluss.

@sarc
Danke, ist eine coole Lösung.

Und hier nochmal die IXmlSerializable Variante, die ich in der zwischenzeit geschrieben habe:


public class ListValues: List<KeyValuePair<string,string>>, IXmlSerializable
    {

        public System.Xml.Schema.XmlSchema GetSchema()
        {
            return null;
        }

        public void ReadXml(System.Xml.XmlReader reader)
        {
            int depth = reader.Depth+1;
            reader.Read();
            
            while (reader.Depth == depth)
            {
                var name = reader.Name;
                var value = reader.ReadElementContentAsString();

                this.Add(new KeyValuePair<string, string>(name,value));
            }
            reader.Read();


        }

        public void WriteXml(System.Xml.XmlWriter writer)
        {
           foreach (var element in this)
            {
                writer.WriteElementString(element.Key,element.Value);
            }
        }
    }

[XmlRoot(ElementName = "Data")]
    public class DataXml
    {
        [XmlElement(ElementName = "Liste")]
        public ListValues Values { get; set; }
}

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von unconnected am .
private Nachricht | Beiträge des Benutzers