mediengestalter.info
FAQ :: Mitgliederliste :: MGi Team

Willkommen auf dem Portal für Mediengestalter

Aktuelles Datum und Uhrzeit: Mi 24.04.2024 00:17 Benutzername: Passwort: Auto-Login

Thema: Erste Gehversuche mit CSharp und XML - Geht das auch anders? vom 07.03.2008


Neues Thema eröffnen   Neue Antwort erstellen MGi Foren-Übersicht -> Programmierung -> Erste Gehversuche mit CSharp und XML - Geht das auch anders?
Autor Nachricht
Clay
Threadersteller

Dabei seit: 04.12.2006
Ort: München
Alter: 37
Geschlecht: Männlich
Verfasst Fr 07.03.2008 15:41
Titel

Erste Gehversuche mit CSharp und XML - Geht das auch anders?

Antworten mit Zitat Zum Seitenanfang

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 Lächel

Beste Grüße, Clay
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 07.03.2008 15:49
Titel

Antworten mit Zitat Zum Seitenanfang

Stichwort Rekursion:

http://de.wikipedia.org/wiki/Rekursion
  View user's profile Private Nachricht senden
Anzeige
Anzeige
Clay
Threadersteller

Dabei seit: 04.12.2006
Ort: München
Alter: 37
Geschlecht: Männlich
Verfasst Fr 07.03.2008 16:06
Titel

Antworten mit Zitat Zum Seitenanfang

bacon hat geschrieben:
Stichwort Rekursion:

http://de.wikipedia.org/wiki/Rekursion


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 Lächel

LG, Clay
  View user's profile Private Nachricht senden Website dieses Benutzers besuchen
bacon

Dabei seit: 24.10.2007
Ort: -
Alter: -
Geschlecht: -
Verfasst Fr 07.03.2008 16:26
Titel

Antworten mit Zitat Zum Seitenanfang

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 *zwinker*

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
  View user's profile Private Nachricht senden
 
Ä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!
Neues Thema eröffnen   Neue Antwort erstellen
MGi Foren-Übersicht -> Programmierung


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.