Entwickler-Ecke

IO, XML und Registry - Mapping von XElement zu Class


alegria - Sa 29.01.11 11:49
Titel: Mapping von XElement zu Class
Hallo,

ist es möglich ohne direkte umständliche bzw. code und zeitaufwändige Zuordnung möglich, aus einem XELement direkt in eine bestimmte Klasse zu "konvertieren"?

Also bisher hab ich sowas:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
class Person
{
string Vorname {get; set;}
string Nachname {get; set;}
}

List<Person) pLst = new PErson();
var abc = XElement.Load(myXMLfile).Elements();
foreach (item in abc)
  pLst.Add(new Person{Vorname = item.Element("Vorname"), Nachname = item.Element("Nachname")});


Was ich möchte wäre sowas wie "direkt" "pLst.Add(new Person{item});" weil die XML-Nodes vom Namen her identisch mit den Properties der Klasse Person sind...

Geht sowas???


huuuuuh - Sa 29.01.11 12:05

schau dir mal das Theama "XML-Serialisierung" an. müsste sein was du suchst...
http://www.c-sharp-library.de/topic_Mit+XmlSerializer+Objekte+als+XML+speichern+und+laden_64947.html


danielf - Sa 29.01.11 13:07

Hallo,
wenn du für das Xml ein Schema hast (oder eins generieren tust) kannst du dir Klassen dafür generieren lassen. Schau mal nach XSD.
Gruß


alegria - Sa 29.01.11 18:50

:) und :(

Also XMLSerializer scheint schonmal definitiv die richtige Ecke zu sein...

Aber ich komme nicht so richtig weiter da ich ein "root" Node um die einschliessenden eigentlichen Infos habe...

<root>
<person>
<vorname>hans</vorname>
</person>
<person>
<vorname>otto</vorname>
<person>
</root>

Mittels:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
XmlSerializer xs = new XmlSerializer(typeof(root));
root r = (root)xs.Deserialize(new XmlTextReader("../../XMLFile2.xml"));
r.ToString();

    public class root {
        public person person;
    }

    public class person
    {
        public string name { get; set; }
        public string rating { get; set; }
    }

komme ich schonmal nach ans gewünschte Ergebnis, aber ich erhalte
a) nur den ersten Datensatz und
b) habe ich ein problem beim auslesen der "adresse" (andere klasse) die ja auch wieder von root umschlossen ist...

Gibts denn nicht irgendwie die möglichkeit erst bei nodelevel2 zu beginnen???

@danielf: namespace gibts leider keines...


alegria - Sa 29.01.11 19:04

Juhu! :)

C#-Quelltext
1:
2:
XmlSerializer xs = new XmlSerializer(typeof(List<person>),new XmlRootAttribute("root"));
List<person> lar = (List<person>)xs.Deserialize(new XmlTextReader("../../XMLFile2.xml"));

Damit wäre das dann wohl gelöst...