Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
Clay
Threadersteller
Dabei seit: 04.12.2006
Ort: München
Alter: 37
Geschlecht:
|
Verfasst Fr 07.03.2008 15:41
Titel Erste Gehversuche mit CSharp und XML - Geht das auch anders? |
|
|
Hallo zusammen,
ich habe Gestern angefangen CSharp und ASPX zu lernen.
Jetzt wollte ich eine XML generieren mit beliebig vielen Knoten und Kindknoten und Kindeskindknoten etc.
Muss ich jetzt, für jede neue Ebene in der XML, so weitermachen oder kann ich das irgendwie schlauer lösen?
C Sharp:
Code: |
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
WriteMyXML();
}
private void WriteMyXML()
{
XmlDocument doc = new XmlDocument();
XmlNode myRoot, myNode, mySecondNode;
XmlAttribute myNodeID, mySecondNodeID;
/* Später Dynamisch aus Flash */
String myRootValue = "Root";
Int32[] myNodehasChildnode = { 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 };
String[] myNodeTextArray = { "Hallo", "Welt", "", "Ist", "Ein", "Blind", "Text", "!", "!!", "!!!" };
String[] mySecondNodeTextArray = { "Das", "Hier" };
/* Später Dynamisch aus Flash */
myRoot = doc.CreateElement(myRootValue);
doc.AppendChild(myRoot);
for (Int32 i = 0; i < 10; i++)
{
Int32 CheckForChildNodes = myNodehasChildnode[i];
myNode = doc.CreateElement("Child" + i);
myNodeID = doc.CreateAttribute("id");
myNodeID.InnerText = i.ToString();
myNode.Attributes.Append(myNodeID);
myRoot.AppendChild(myNode);
if (CheckForChildNodes >= 1)
{
for (Int32 h = 0; h < 2; h++)
{
mySecondNode = doc.CreateElement("SubChild" + h);
mySecondNodeID = doc.CreateAttribute("id");
mySecondNodeID.InnerText = h.ToString();
mySecondNode.Attributes.Append(mySecondNodeID);
mySecondNode.InnerText = mySecondNodeTextArray[h];
myNode.AppendChild(mySecondNode);
}
}
else {
myNode.InnerText = myNodeTextArray[i];
}
}
doc.Save(@"C:\Dokumente und Einstellungen\umc\Desktop\WebSite2\App_Data\TextAttribute.xml");
}
}
|
Die XML die Ausgespuckt wird:
Code: |
- <Root>
<Child0 id="0">Hallo</Child0>
<Child1 id="1">Welt</Child1>
- <Child2 id="2">
<SubChild0 id="0">Das</SubChild0>
<SubChild1 id="1">Hier</SubChild1>
</Child2>
<Child3 id="3">Ist</Child3>
<Child4 id="4">Ein</Child4>
<Child5 id="5">Blind</Child5>
<Child6 id="6">Text</Child6>
<Child7 id="7">!</Child7>
<Child8 id="8">!!</Child8>
<Child9 id="9">!!!</Child9>
</Root>
|
Vielen Dank im Voraus
Beste Grüße, Clay
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
|
|
|
|
Anzeige
|
|
|
Clay
Threadersteller
Dabei seit: 04.12.2006
Ort: München
Alter: 37
Geschlecht:
|
Verfasst Fr 07.03.2008 16:06
Titel
|
|
|
Hallo,
also wenn ich das richtig verstanden habe ist das eine Schleife.
Das habe ich ja mit "for" auch schon gemacht, aber wie kann ich jetzt folgendes dynamisch umsetzen:
if firstChild has Childnodes add Childnodes (ok, hab ich mit for gelöst) -> if Childnode has Childnode add Childnodes(ok, hab ich mit for gelöst, muss aber immer myRoot.AppendChild(myNode) statisch sozusagen reinschreiben. für die nächste Ebene wäre es dann myNode.AppendChild(mySecondNode) und für die nächste dann mySecondNode.AppendChild(myThirdNode) usw.)
Das heißt ich müsste am anfang der WriteMyXML() Function schon wissen wieviele "Ebenen" meine XML hat und das sit ja nicht mehr dynamisch.
XmlDocument doc = new XmlDocument();
XmlNode myRoot, myNode, mySecondNode;
XmlAttribute myNodeID, mySecondNodeID;
Naja bin ja noch neuling und darf noch solche Fragen stellen ^^
Vielen Dank für die Hilfe
LG, Clay
|
|
|
|
|
bacon
Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
|
Verfasst Fr 07.03.2008 16:26
Titel
|
|
|
Nein, wenn du rein mit Schleifen arbeitest, implementierst du keine rekursive, sondern eine iterative Lösung. Rekursion bedeutet mal auf (meinem) deutsch formuliert: Du definierst einen Codeblock (bspw. eine Funktion oder Objektmethode), die von einem Anker aus aufgerufen wird. Diesen Codeblock führst du nun abhängig von den Eigenschaften der Eingangsparameter so oft hintereinander aus, bis eine bestimmte Stopbedingung erfüllt ist. Man geht praktisch so oft "wieder zurück zum Anfang", wie nötig. Nur mal Beispielhaft, leider reichen meine rudimentären JAVA-Kenntnisse nicht aus, um aus deinem C#-Code auf anhieb schlau zu werden bzw. zu begreifen, was du eigentlich machen willst
Anstatt
Code: |
FOR EACH node IN nodes DO
tuWasMitDemKnoten(node);
IF ( node.hasChilds() )
FOR EACH subnode IN node.childs DO
tuWasMitDemKnoten(subnode);
IF (subnode.hasChilds())
FOR EACH ( subsubnode IN subnode.childs )
tuWasMitDemKnoten(subsubnode);
// und immer so weiter
....
ENDFORACH
ENDIF
END FOR
END IF
tuWasMitDemKnoten();
END FOR
|
machst du folgendes: Code: |
PROCEDURE Rekursion ( xmlKnotenMenge )
FOR EACH knoten IN xmlKnotenMenge DO
// irgendwas mitm Knoteninhalt machen
stdout ( knoten.value )
// wenn der knoten kinder hat ...
IF ( knoten.hasChilds() )
// ... Rekursiver Aufruf
Rekursion ( knoten.childs )
ENDIF
END FOR
END PROCEDURE
// Startpunkt:
Rekursion (meineKnotenDieIchDurchlaufenWill)
|
Damit sparst du dir in besonderen Fälle ne Menge arbeit und hat gleichzeitig einen allgemeingültigen Algorithmus, während die iterative Lösung endlich ist, sprich du deckst nur so viele Ebenen deines Baums ab, wie du auch Schleifen implementierst (deren Code sich ständig wiederholt).
Es ist immer abzuwägen, in welchen Fällen eine rekursive und in welchen eine iterative Lösung vorzuziehen ist. Beides hat vor- und nachteile.
Zuletzt bearbeitet von bacon am Fr 07.03.2008 16:31, insgesamt 2-mal bearbeitet
|
|
|
|
|
|
|
|
Ähnliche Themen |
Erste Gehversuche mit CSS...
erste Gehversuche mit Datenbanken
Datenbank mal anders
Tabelle in IE anders als im FIREFOX
flash navigation mal anders
weitemachen? bzw was kann ich anders machen!
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|