Laden...

XmlSerializer und Key Value Liste

Erstellt von unconnected vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.368 Views
unconnected Themenstarter:in
849 Beiträge seit 2006
vor 11 Jahren
XmlSerializer und Key Value Liste

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 😃

I
35 Beiträge seit 2011
vor 11 Jahren

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.

S
417 Beiträge seit 2008
vor 11 Jahren

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);
			}
		}
	}
}
unconnected Themenstarter:in
849 Beiträge seit 2006
vor 11 Jahren

@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; }
}