| 

.NET C# Java Javascript Exception

2
Hallo,
ich habe Probleme, mit einer rekursiven Funktion eine XML-Datei zu erstellen. Ich habe eine Liste mit Prozessen, die jeweils Subprozesse haben können, die wiederum Subprozesse haben können usw. Beliebige Tiefe also.

Nun möchte ich mit Hilfe einer Funktion, die ja rekursiv sein muss, eine XML-Datei erstellen, die so aussieht:

<Prozesse>
<Prozess>
<ID>1</ID>
<Kurzbezeichnung>blabla</Kurzbezeichnung>
<Subprozesse>
<Prozess>
<ID>2</ID>
<Kurzbezeichnung>Sub 1</Kurzbezeichnung>
<Subprozesse>
...
</Subprozesse>
</Prozess>
<Prozess>
...
</Prozess>
</Subprozesse>
</Prozesse>


Ich habe bisher folgende Funktion, die aber nicht funktioniert. Sie liefert mir nur die oberste Ebene, nicht aber die Subprozesse. Irgendwas stimmt mit der Rekursion noch nicht. Sieht jemand den Fehler und kann mir dabei behilflich sein?

private static string WriteXml(IList<Prozess> Prozesse)
{
XElement root = new XElement("Prozesse");

foreach (Prozess prozess in Prozesse)
{
// Prozessknoten erzeugen
XElement prozessIDNode = new XElement("ID", prozess.ProzessID);
XElement kurzbeschreibungNode = new XElement("Kurbezeichnung", prozess.Kurzbezeichnung);
XElement subprozesseNode = new XElement("Subprozesse");
XElement prozessNode = new XElement(typeof(Prozess).Name, prozessIDNode, kurzbeschreibungNode, subprozesseNode);
root.Add(prozessNode);

foreach (Prozess sub in prozess.Subprozess)
{
WriteXml(sub.Subprozess);
}
}

return root.ToString();
}
06.07.2011
shabi 159 1 3
1 Antwort
0
Du darfst das Root-Element nicht in jedem Funktionsaufruf erneut erzegen:

XElement root = new XElement("Prozesse");


Das was du brauchst müßte so aussehen:

private static string WriteXml(IList<Prozess> Prozesse, ref XElement? root)
{
if(root == null)
XElement root = new XElement("Prozesse");

foreach (Prozess prozess in Prozesse)
{
// Prozessknoten erzeugen
XElement prozessIDNode = new XElement("ID", prozess.ProzessID);
XElement kurzbeschreibungNode = new XElement("Kurbezeichnung", prozess.Kurzbezeichnung);
XElement subprozesseNode = new XElement("Subprozesse");
XElement prozessNode = new XElement(typeof(Prozess).Name, prozessIDNode, kurzbeschreibungNode, subprozesseNode);
root.Add(prozessNode);

foreach (Prozess sub in prozess.Subprozess)
{
WriteXml(sub.Subprozess, ref root);
}
}

return root.ToString();
}
06.07.2011
Floyd 14,6k 3 9
Hallo Floyd,
danke für die Info. Es funktioniert jetzt, aber wenn ich das mit dem nullable so mache wie Du vorschlägst, erhalte ich die Fehlermeldung "Fehler 1 Der Typ "System.Xml.Linq.XElement" darf keine NULL-Werte zulassen, wenn er als T-Parameter im generischen Typ oder in der generischen Methode "System.Nullable<T>" verwendet werden soll. D:\Projekte\IKS\Development\Source\IKS\PD\IKSStruktur\ProzessUserCode.cs 118 31 IKS
"

Ich habe XElement root jetzt als nicht nullable und übergebe beim ersten Funktionsaufruf den root ("Prozesse"). Geht das auch anders?
shabi 07.07.2011
hmm .. du nennst die Eingangsvariable nicht "root" sondern "base" und schreibst anstelle der IF-Abfrage und Zuweisung:
XElement root = (base == null) ? new XElement("Prozesse") : (XElement)base;

Oder du baust das ganze auf Klassen-Basis um und erzeugst das Root-Objektt entweder im Construktor oder beim ersten Funktionsaufruf und speicherst es in einer Klassen-Variable.
Floyd 07.07.2011

Stelle deine Xml-Frage jetzt!