| 

.NET C# Java Javascript Exception

1
Hallo,
ich stelle die Frage von unten noch mal konkreter. Es sollte eigentlich nicht schwierig sein. Ich habe eine hierarchische Struktur, die wie folgt aussieht:

<Prozesse>
<Prozess>
<ID />
<Subprozesse>
<Prozess>
<ID />
<Subprozesse>
// kann beliebig tief verschachtelt sein
</Subprozesse>
</Prozess>
</Subprozesse>
</Prozess>
</Prozesse>


Es gibt also einen Root "Prozesse" der beliebig viele Prozess-Knoten haben kann. Jeder Prozess wiederum kann beliebig viele Subprozesse haben, die wiederum weitere Subprozesse haben usw. Ich möchte dieses XML gerne in eine hierarchische Liste parsen. Wie macht man so etwas denn am besten mit LINQ, oder evtl. auch XPathNavigator?
News:
07.07.2011
shabi 159 1 3
shabi 159 1 3
Es wäre vielleicht geschickter gewesen, Du hättest die erste Frage editiert, statt sie neu zu stellen. Könntest Du dann bitte zumindest noch jeweils in den Fragestellungen aufeinander verlinken?
Matthias Hlawatsch 07.07.2011
2 Antworten
1
LINQ wäre geeignet, um Abfragen auf einem XML-Dokument auszuführen, und der XPathNavigator, um darin zu navigieren. Wenn es Dir aber darum geht, ein komplettes Dokument in eine entsprechende .NET-Objektstruktur zu übertragen, dann hilft Dir der XmlSerializer. Du schreibst dafür .NET-Klassen, oder läßt sie Dir mit dem Tool xsd aus dem XML-Schema zu Deinem Dokument generieren. Für deinen Fall sollte im wesentlichen das hier passen:

public class Prozess
{
public int ID { get; set; }

public Prozess[] Subprozesse { get; set; }
}


Falls Du Einfluss auf den Serialisierungsvorgang nehmen möchtest, kannst Du das nmit Attributen wie XmlElement oder XmlRoot tun.

Um mit dem Root-Element "Prozesse" umzugehen, kannst Du entweder eine Klasse definieren, die so heißt - oder Du konfigurierst den XmlSerializer noch ein wenig:

var o = new System.Xml.Serialization.XmlAttributeOverrides();
var r = new System.Xml.Serialization.XmlAttributes();
r.XmlRoot = new System.Xml.Serialization.XmlRootAttribute("Prozesse");
o.Add(typeof(Prozess[]), r);
var ser = new System.Xml.Serialization.XmlSerializer(typeof(Prozess[]), o);
var prozesse = (Prozess[])ser.Deserialize(xmlReader);
07.07.2011
Matthias Hlawatsch 13,2k 4 9
Hallo Matthias,
da es schnell gehen muss, suche ich nach einer einfachen Variante. Ich habe bereits eine Prozess-Klasse. Gibt es nicht die Möglichkeit, einfach per XPathNavigator durch das XML zu navigieren, für jeden Prozess ein Prozess-Objekt zu erzeugen und das anschließend der Liste hinzuzufügen?
shabi 07.07.2011
Vermutlich geht auch das. Mit dem XPathNavigator kenne ich mich aber nicht aus. Aber einfach finde ich auch meinen Vorschlag - der komplette Code für das Einlesen Deines Beispiel-XMLs steht da, Du mußt nur noch den XmlReader erzeugen.
Schwieriger wird es möglicherweise, wenn Deine exitierende Prozess-Klasse anders aufgebaut ist. Dann gehört das aber mit in die Frage. Falls nur die Properties anders heißen, kannst Du sie mit dem XmlElementAttribute an die XML-Struktur anpassen.
Matthias Hlawatsch 07.07.2011
0
Hmm, ich verstehe das noch nicht ganz. Kannst Du mir evtl. zeigen, wie die Funktion aussehen müsste?
07.07.2011
shabi 159 1 3
Das sollte wohl ein Kommentar werden statt einer Frage...
Sei's drum - was genau verstehst Du nicht? Du definierst die Klasse Prozess wie angegeben, und steckst das zweite Codeschnipsel in eine beliebige Methode. Den XmlReader übergibst Du der Methode oder erzeugst ihn Dir lokal (z.B. XmlReader.Create("prozesse.xml")), und am Ende steht in prozesse das Array der Prozess-Knoten aus der obersten Ebene Deines XML.
Matthias Hlawatsch 07.07.2011
1
Zur Erklärung. Mit dem XmlSerializer / XmlDeSerializer nimmt dir das .Net-Framework die Arbeit ab, also Objekten und Listen XML-Dokumente zu erzeugen oder diese zu lesen. Du kannst also mit dem XmlSerializer die Prozess-Liste die du bereits in einer vorherigen Frage aufgezeigt hast als XML schreiben und mit dem XmlDeSerializer wieder zurückwandeln lassen.
Floyd 07.07.2011

Stelle deine Xml-Frage jetzt!