# [C#] Treeview-Knoten mit Xml Namespaces verknüpfen



## DasBöse (12. März 2007)

Also hab dann mal wieder ´n Anfängerproblem schätze ich. Also ich möchte eine XML auslesen. Das hab ich auch schon geschafft das mache ich so:
	
	
	



```
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strDatei = Application.StartupPath + "\\Skin.xml";

            System.Xml.XmlTextReader xmltReader = new System.Xml.XmlTextReader(strDatei);

            while (xmltReader.Read())
            {
                if ((xmltReader.NodeType == System.Xml.XmlNodeType.Element) && (xmltReader.Name == "SkinElement"))
                {
                    if (this.rtfXML.Text != "")
                    {
                        this.rtfXML.Text += "\n";
                    }
                }
                if (xmltReader.NodeType == System.Xml.XmlNodeType.Text)
                {
                    this.rtfXML.Text += xmltReader.Value + "\t";
                }
            }                
                xmltReader.Close();
            }
```

So ich weiß irgendwas muss ich ändern.

Meine Treevie Knoten-Punkte heißen Masterpage, SiteHeader und SiteFooter.

Nun möchte ich wenn ich auf einen dieser Punkte klicke, das nur der XML-Text von Masterpage angezeigt wird bzw. von SiteHeader oder SiteFooter die in der XML-Datei vorhanden sind.

MIt der MSDN und google habe ich leider nichts gefunden.

Bitte helft mir. Schon mal danke im vorraus.

MFG


----------



## mslap (13. März 2007)

Hallo,

also ganz weiss ich ned was du machen willst. Was verbirgt sich denn hinter this.rtfXML? Ist das nur eine Textbox?

Aber ein Vorschlag, über e kannst du auf den ausgewählten TreeNode zugreifen.
Das könntest du dann folgender masen abfragen (Ausm Kopf):


```
if(e.SelectedNode==Masterpage)...
else if(e.SelectedNode==SiteHeader)...
else if(e.SelectedNode==SiteFooter)...
```

Dannach dann die entsprechenden Stellen im XML auslesen und eben ausgeben.
Hoffe das hilft dir weiter, wenn nicht wären ein paar mehr Erklärungen angenehm.


----------



## DasBöse (13. März 2007)

mslap hat gesagt.:


> Hallo,
> 
> also ganz weiss ich ned was du machen willst. Was verbirgt sich denn hinter this.rtfXML? Ist das nur eine Textbox?
> 
> ...



Hi,

erstmal danke für die Antwort.

Also die rtfXML ist eine RichTextBox.

Zu deinem Lösungsansatz, da ich wie gesagt totaler Anfänger in C# bin nicht über irgendwas falsches aufregen ;-) Mein Programm sieht so aus das links eine Treeview dargestellt wird und rechts die RichTextBOx (alis rtfXML), nun habe ich z.B.: 3 Knoten (Nodes) in meiner Treeview die mit MasterPage usw. benannt sind. Jetzt möchte ich wenn ich auf einen dieser Knoten klicke nur der Text der dazugehörigen Node in der XML ausgegeben wird. 

Wäre net, wenn du deinen Lösungsansatz in meinen vorgegebenen Code eifügen kannst ;-)

Schon mal danke im vorraus!

MFG


----------



## mslap (13. März 2007)

```
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strDatei = Application.StartupPath + "\\Skin.xml";
            string temp;

// Speichere den Namen des ausgewählten Nodes
            temp = this.treeView1.get_selectedNode.Text;

            System.Xml.XmlTextReader xmltReader = new System.Xml.XmlTextReader(strDatei);

// Lese XML solange bis du in die Section mit den richtigen Daten kommst
            while(xmltReader.Read()){
                    if(xmltReader.Name == temp) break;
            }

//Dannach einfach alle Daten auslesen wie bisher
            while (xmltReader.Read())
            {
                if ((xmltReader.NodeType == System.Xml.XmlNodeType.Element) && (xmltReader.Name == "SkinElement"))
                {
                    if (this.rtfXML.Text != "")
                    {
                        this.rtfXML.Text += "\n";
                    }
                }
                if (xmltReader.NodeType == System.Xml.XmlNodeType.Text)
                {
                    this.rtfXML.Text += xmltReader.Value + "\t";
                }
            }                
                xmltReader.Close();
            }
```

Also ich geb mal überhauot keine garantie für den Syntax, da ich nur mit managed C++ hier im Moment rummache und da der Sytnax total anders ist. 

Zur Erklärung:
Du nimmst den Namen deines Treenodes, speicherst den in einer String Variable. Dannach lest du dann dein XML File solange aus bis du in die Sektion mit den benötigten Daten kommst (Falls dir das hier nicht weiterhilf vielleicht mal dein XML  file mitposten). Dannach machst du ganz normal weiter und schreibst den text in das rtb Feld.
(Praktischerweise hätte der Sektionsname in deinem XML file denselben namen wie der Treenode, wovon ich hier mal ausgehen)

Hoffe das hilft dir erstmal weiter und du verstehst ungefähr wie ichs gemeint habe.


----------



## DasBöse (13. März 2007)

Also du liegst schon mit deiner Vermutung richtig das die Tree Punkte mit der von der XML überinstimmen. Die XML (Skin.xml) sieht so aus:

```
<?xml version="1.0" encoding="UTF-8" standalone="no" ?> 
- <UranusSkin>
  <SkinElement name="Masterpage"><!-- Haupt-Tabelle --> <table width="100%" cellpadding="0" cellspacing="0" border="0"> #HEADER# </table> <!-- Ende Haupt-Tabelle --> <!-- Zweite Tabelle --> <table width="100%" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF" border="0"> <tr> <!-- Separator --> <td width="10"><img src="#SKINIMAGEPATH#/empty.gif" width="10" height="1"></td> <!-- Ende Separator --> #LEFTPARTS# <!-- Separator --> <td width="10"><img src="#SKINIMAGEPATH#/empty.gif" width="10" height="1"></td> <!-- Ende Separator --> #MIDDLEPARTS# <!-- Separator --> <td width="10"><img src="#SKINIMAGEPATH#/empty.gif" width="10" height="1"></td> <!-- Ende Separator --> #RIGHTPARTS# </tr> </table> <!-- Ende zweite Tabelle --> #FOOTER#</SkinElement> 
  <SkinElement name="SiteHeader"><!-- Header --> <tr> <td bgColor="#FFFFFF"> <IMG alt="Logo" src="#SITEIMAGEPATH#/#LOGO#" border="0" > </td> </tr> <!-- Ende Header --> <!-- Subheader --> <tr><td class="urSubheader" bgcolor="#6F9FCF"> <!-- Breadcrumb-Menu --> #BREADCRUMB0# <!-- Ende Breadcrumb-Menü --> </td></tr> <!-- Ende Subheader --></SkinElement> 
  <SkinElement name="SiteFooter"><!-- Footer --> <table width="100%" cellpadding="0" cellspacing="0" border="0"> <tr> <td class="urFooter"> #FOOTERTEXT# </td> </tr> </table> <!-- /Footer --></SkinElement> 
  <SkinElement name="SiteLeftside"><!-- Linker Bereich --> <td width="150" valign="top"><br> #CONTENT# </td> <!-- Ende linker Bereich --></SkinElement> 
  <SkinElement name="SiteRightSide"><!-- rechter Bereich --> <td width="150" valign="top"><br> #CONTENT# </td> <!-- Ende rechter Bereich --> <!-- Separator --> <td width="10"><img src="#SKINIMAGEPATH#/empty.gif" width="16" height="1"></td> <!-- Ende Separator --></SkinElement> 
  <SkinElement name="Box"><!-- Box Standard --> <table width="100%" cellpadding="0" cellspacing="1" bgcolor="#6F9FCF"> <tr><td> <table width="100%" cellpadding="0" cellspacing="10" bgcolor="#FFFFFF"> <tr><td class="urDefaultBox"> #CONTENT# </td></tr></table> </td></tr></table> <br> <!-- Ende Box Standard --></SkinElement> 
  <SkinElement name="BoxImportant"><!-- Box Wichtig --> <table width="100%" cellpadding="0" cellspacing="1" bgcolor="#800000"> <tr><td> <table width="100%" cellpadding="0" cellspacing="10" bgcolor="#FFBFBF"> <tr><td class="urDefaultBox"> #CONTENT# </td></tr></table> </td></tr></table> <br> <!-- Ende Box Wichtig --></SkinElement> 
  <SkinElement name="BoxWidgetLeft"><!-- Left Widget --> <center> <table width="100%" cellpadding="0" cellspacing="1" bgcolor="#6F9FCF"> <tr><td> <table width="100%" cellpadding="0" cellspacing="5" bgcolor="#FFFFFF"> <tr><td height="20" class="urLeftWidgetHeader"> <center> #HEADER# </center> </td></tr> <tr><td class="urLeftWidget"> #CONTENT# <br> </td></tr></table> </td></tr></table> </center> <br> <!-- Ende Left Widget --></SkinElement> 
  <SkinElement name="BoxWidgetImportantLeft" /> 
  <SkinElement name="BoxWidgetRight"><!-- Right Widget --> <center> <table width="100%" cellpadding="0" cellspacing="1" bgcolor="#6F9FCF"> <tr><td> <table width="100%" cellpadding="0" cellspacing="5" bgcolor="#FFFFFF"> <tr><td height="20" class="urRightWidgetHeader"> <center> #HEADER# </center> </td></tr> </table> <table width="100%" cellpadding="0" cellspacing="0" bgcolor="#FFFFFF"> <tr><td class="urRightWidget"> #CONTENT# <br> </td></tr></table> </td></tr></table> </center> <br> <!-- Ende Left Widget --></SkinElement> 
  <SkinElement name="BoxWidgetImportantRight" /> 
  <SkinElement name="BoxWidgetMiddle"><!-- Widget --> <center> <table width="100%" cellpadding="0" cellspacing="1" bgcolor="#6F9FCF"> <tr><td> <table width="100%" cellpadding="0" cellspacing="5" bgcolor="#FFFFFF"> <tr><td height="20" class="urMiddleWidgetHeader"> #HEADER# </td></tr> <tr><td class="urMiddleWidget"> #CONTENT# <br> </td></tr></table> </td></tr></table> </center> <br> <!-- Ende Widget --></SkinElement> 
  <SkinElement name="BoxWidgetImportantMiddle" /> 
  <SkinElement name="TextHeader"><span class="urTextHeader">#CONTENT#</span></SkinElement> 
  <SkinElement name="TextSubheader"><span class="urTextSubheader">#CONTENT#</span></SkinElement> 
  <SkinElement name="TextHeaderImportant"><span class="urTextHeaderImportant">#CONTENT#</span></SkinElement> 
  <SkinElement name="TextSubheaderImportant"><span class="urTextSubheaderImportant">#CONTENT#</span></SkinElement> 
  <SkinElement name="TextArea"><span class="urTextDefault">#CONTENT#</span></SkinElement> 
  <SkinElement name="TextCode"><span class="urCode">#CONTENT#</span></SkinElement> 
  <SkinElement name="Menu1Box"><!-- Menübox Start --> <table width="140" border="0" cellspacing="0" cellpadding="0"> #CONTENT# </table> <!-- Menübox Ende --></SkinElement> 
  <SkinElement name="Menu1Header"><!-- MenuHeader --> <tr> <td> <img src="#SKINIMAGEPATH#/empty.gif" width="10" height="16" border="0" alt=""> </td> <td class="urMenu1Header" colspan="3"> &nbsp;&nbsp;<b>#TEXT#</b> </td> </tr> <!-- Ende MenuHeader --></SkinElement> 
  <SkinElement name="Menu1Subheader"><!-- Menusubheader --> <tr><td><img src="#SKINIMAGEPATH#/empty.gif" width="10" height="16" border="0" alt=""></td><td class="urMenu1Subheader" colspan="3">&nbsp;&nbsp;#TEXT#</td></tr> <!-- Ende MenuSubHeader --></SkinElement> 
  <SkinElement name="Menu1Item"><!-- MenuItem --> <tr> <td class="urMenu1Background"><img src="#SKINIMAGEPATH#/empty.gif" width="10" height="1" alt="" /></td> <td class="urMenu1Background"><img src="#SKINIMAGEPATH#/empty.gif" width="15" height="1" alt="" /></td> <td class="urMenu2" colspan="2" onMouseOver="javascript:navHigh1(this);return true;" onMouseOut="javascript:navLow1(this);return true;"> <table cellspacing="0" cellpadding="0" border="0"> <tr> <td width="25" height="20"><a class="urMenu1Item" href="#MENULINK#">#GLYPH#</a></td> <td height="20"><a class="urMenu1Item" href="#MENULINK#">#TEXT#</a></td> </tr> </table> </td> </tr> <!-- Ende MenuItem --></SkinElement> 
  <SkinElement name="Menu1Separator"><!-- Separator --> <tr><td height="10" colspan="2"><img src="#SITEIMAGEPATH#/empty.gif" height="10"></td></tr> <!-- /Separator --></SkinElement> 
  <SkinElement name="Menu2Box" /> 
  <SkinElement name="Menu2Header" /> 
  <SkinElement name="Menu2Subheader" /> 
  <SkinElement name="Menu2Item" /> 
  <SkinElement name="Menu2Separator" /> 
  <SkinElement name="Menu3Box" /> 
  <SkinElement name="Menu3Header" /> 
  <SkinElement name="Menu3Subheader" /> 
  <SkinElement name="Menu3Item" /> 
  <SkinElement name="Menu3Separator" /> 
  <SkinElement name="Breadcrumb1Box"><table cellpadding="0" cellspacing="0" bgcolor="#6F9FCF" align="left"><tr><td class="breadcrumb">&nbsp;</td> #CONTENT# </tr> </table></SkinElement> 
  <SkinElement name="Breadcrumb1Item"><!-- Breadcrumb-Item --> <td class="urBreadcrumb1" align="left"><a class="urBreadcrumb1Item" href="#MENULINK#" alt="#MENUDESC#">#TEXT#</a></td> <!-- Ende Breadcrumb-Item --></SkinElement> 
  <SkinElement name="Breadcrumb1Separator"><!-- Separator --></SkinElement> 
  <SkinElement name="Breadcrumb2Box" /> 
  <SkinElement name="Breadcrumb2Item" /> 
  <SkinElement name="Breadcrumb2Separator" /> 
  <SkinElement name="SiteMiddleSide"><!-- Hauptbereich --> <td valign="top"><br> #CONTENT# </td> <!-- Ende Hauptbereich --></SkinElement> 
  <SkinElement name="SiteSubheader" /> 
  </UranusSkin>
```

Und die Syntax stimmt soweit außer das die Methode get_selectedNode.Text nicht existiert. Ich denke mal das müsste in C# dann SelectedNode.Text heissen, oder?

Also wenn ich dies alles wie beschrieben mache geht es trotzdem nicht. Ich glaube das liegt daran das nirgends auf die Namen MasterPage usw. verwiesen wird, oder liege ich da falsch?

Danke das du mir hilfst.

MFG


----------



## mslap (13. März 2007)

```
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strDatei = Application.StartupPath + "\\Skin.xml";
            string temp;

// Speichere den Namen des ausgewählten Nodes
            temp = "Masterpage";//this.treeView1.SelectedNode.Text;

            System.Xml.XmlTextReader xmltReader = new System.Xml.XmlTextReader(strDatei);

// Lese XML solange bis du in die Section mit den richtigen Daten kommst
//Alle Attribute prüfen ob sie denselben namen wie das treenode haben
            while(xmltReader.Read()){
                    if(xmltReader.NodeType == System.Xml.XmlNodeType.Attribute &&
                       xmltReader.Value == temp) break;
            }

//Dannach einfach alle Daten auslesen wie bisher
//Erst zurück zum Element gehen

           xmltReader.MoveToElement(); 

//Die Überprüfung kannst du dir dann sparen (falls sich xml file nicht ändert) 
// und einfach den Element Text auslesen

                 if (this.rtfXML.Text != "")
                 {
                       this.rtfXML.Text += "\n";
                 }

                this.rtfXML.Text += reader.ReadElementString() + "\t";           
                xmltReader.Close();
            }
```

So könnte es auch funktionieren. Wenn nicht kann ich dir immo auch nicht weiterhelfen, weil ich mich mit XML an sich und der XMLReader Klasse eher nicht so gut auskenne. 
Zur Erklärung: Du liest dein XML file solange bis du an ein Attribut kommst, das denselben Namen wie dein treeNode hat (hier Masterpage). Mit MoveToElement solltest du dann an das zugehörige ElementNode zurückspringen (also SkinElement), den Inhalt solltest du dann mit ReadElementString oder auch mit Value auslesen können (Falls sich der XML reader nicht an deinen HTML tags stört, das weiss ich nämlich ned).

Hoffe es hilft dir weiter. Einfach mal ausprobieren (Im debugger) und mal das XML file Schritt für Schritt auslesen lassen und die XMLReader Inhalte überprüfen, ob er dann auch richtig stehen bleibt, bzw. das richtige Element dann auch ausliest.


----------



## DasBöse (13. März 2007)

Also ich glaube jetzt haben wir´s fast. Schon mal Danke.


```
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strDatei = Application.StartupPath + "\\Skin.xml";
            string temp;

            // Speichere den Namen des ausgewählten Nodes
// Hier ist glaube ich der Fehler
            temp = "Masterpage"; //this.treeView1.SelectedNode.Text;

            System.Xml.XmlTextReader xmltReader = new System.Xml.XmlTextReader(strDatei);

            // Lese XML solange bis du in die Section mit den richtigen Daten kommst
            //Alle Attribute prüfen ob sie denselben namen wie das treenode haben
            while (xmltReader.Read())
            {
                if (xmltReader.NodeType == System.Xml.XmlNodeType.Attribute && xmltReader.Value == temp) break;
            }

            //Dannach einfach alle Daten auslesen wie bisher
            //Erst zurück zum Element gehen

            xmltReader.MoveToElement();

            //Die Überprüfung kannst du dir dann sparen (falls sich xml file nicht ändert) 
            // und einfach den Element Text auslesen

                if (this.rtfXML.Text != "")
                {
                    this.rtfXML.Text += "\n";
                }
// Der reader den du angegeben hast existiert nicht und wenn ich den xmltReader aufrufe //gibt´s nen Crash. Und zwar hat er angeblich keine Node ausgewählt und sagt node kann //nicht "None" sein
                this.rtfXML.Text += xmltReader.Value + "\t";
                xmltReader.Close();
            }
```

Also wenn ich jetzt das Programm starte bekomme ich immer ein paar Leerzeilen in meine rtfXML. Das heisst soviel wie "Du hast keine Node ausgewählt, deshalb füge ich dir nun lauter Leerzeilen ein!" :suspekt: 

Also ich glaube jetzt muss nur noch auf den Node Masterpage verwiesen werden. Wie mache ich das? Ich glaube das war´s auch dann. 

MFG


----------



## mslap (13. März 2007)

MoveToContent();

haben wir vergessen:


```
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strDatei = Application.StartupPath + "\\Skin.xml";
            string temp;

            // Speichere den Namen des ausgewählten Nodes
// Hier ist glaube ich der Fehler
            temp = "Masterpage"; //this.treeView1.SelectedNode.Text;

            System.Xml.XmlTextReader xmltReader = new System.Xml.XmlTextReader(strDatei);

            xmltReader.MoveToContent();//Springt dann an das erste Element im File

            // Lese XML solange bis du in die Section mit den richtigen Daten kommst
            //Alle Attribute prüfen ob sie denselben namen wie das treenode haben
            while (xmltReader.Read())
            {
                if (xmltReader.NodeType == System.Xml.XmlNodeType.Attribute && xmltReader.Value == temp) break;
            }

            //Dannach einfach alle Daten auslesen wie bisher
            //Erst zurück zum Element gehen

            xmltReader.MoveToElement();

            //Die Überprüfung kannst du dir dann sparen (falls sich xml file nicht ändert) 
            // und einfach den Element Text auslesen

                if (this.rtfXML.Text != "")
                {
                    this.rtfXML.Text += "\n";
                }
// Der reader den du angegeben hast existiert nicht und wenn ich den xmltReader aufrufe //gibt´s nen Crash. Und zwar hat er angeblich keine Node ausgewählt und sagt node kann //nicht "None" sein
                this.rtfXML.Text += xmltReader.Value + "\t";
                xmltReader.Close();
            }
```


----------



## DasBöse (13. März 2007)

Es haut jetzt soweit alles hin. Außer das das Programm eigentlich nit das macht wsa ich will. Ich habe jetzt alles genauso gemacht wie du es mir beschrieben hast, nur fügt es die Zeilen von Masterpage nicht ein. Es ist aber keine Fehlerausgabe zu erkennen, außerdem fürgt das Programm halt immernoch diese Leerzeiocehn ein, weiß auch nit genau warum!

Muss man vielleicht das Ereignis ändern also nicht mehr treeView_afterSelect? Was hat eigentlich dieses hier zu bedeuten:

```
temp = "Masterpage"; //this.treeView1.SelectedNode.Text;
```

Wieso ist der Code deaktiviert? Muss ich ihn aktivieren und irgendwo einfügen? Wenn ja, wo und wie?

So kurz davor und trotzdem fehlt noch irgendwas. Ich hoffe wir kriegen es noch hin.

MFG


----------



## mslap (13. März 2007)

temp = "Masterpage"; //this.treeView1.SelectedNode.Text;

Das solltest du schon wieder ändern in 

temp = this.treeView1.SelectedNode.Text;

das war nur Beispielhaft, damit du es besser verstehst, es sollte ja abhängig vom TreeView.Node.Text das entsprechende Element in dem XMl File auslesen.

Zu den leerzeichen:

Ich denke dass der XMLReader Probleme mit den HTML Tags hat.

Probiers mal mit ReadInnerXml vielleicht achtet der dann nicht auf die html tags.

```
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
        {
            string strDatei = Application.StartupPath + "\\Skin.xml";
            string temp;

            // Speichere den Namen des ausgewählten Nodes
// Hier ist glaube ich der Fehler
            temp = this.treeView1.SelectedNode.Text;

            System.Xml.XmlTextReader xmltReader = new System.Xml.XmlTextReader(strDatei);

            xmltReader.MoveToContent();//Springt dann an das erste Element im File

            // Lese XML solange bis du in die Section mit den richtigen Daten kommst
            //Alle Attribute prüfen ob sie denselben namen wie das treenode haben
            while (xmltReader.Read())
            {
                if (xmltReader.NodeType == System.Xml.XmlNodeType.Attribute && xmltReader.Value == temp) break;
            }

            //Dannach einfach alle Daten auslesen wie bisher
            //Erst zurück zum Element gehen

            xmltReader.MoveToElement();

            //Die Überprüfung kannst du dir dann sparen (falls sich xml file nicht ändert) 
            // und einfach den Element Text auslesen

                if (this.rtfXML.Text != "")
                {
                    this.rtfXML.Text += "\n";
                }
// Der reader den du angegeben hast existiert nicht und wenn ich den xmltReader aufrufe //gibt´s nen Crash. Und zwar hat er angeblich keine Node ausgewählt und sagt node kann //nicht "None" sein
                this.rtfXML.Text += xmltReader.ReadInnerXml() + "\t";
                xmltReader.Close();
            }
```

Vielleicht funktionierts dann. 
Hier kannst du auch mal nachschaun und dir mal die einzelnen Member des XMLReaders durchlesen (Ist auch überall ein Beispiel dabei). Probier mal ein bisschen rum.


----------



## DasBöse (14. März 2007)

Hmm, also wir gehen ja jetzt davon aus das Masterpage der erste Node in der XML ist (ist er auch) trotzdem gehts nicht. Ich glaube entweder greift er ins leere das würde erklären warum er nix schreibt oder er findet Masterpage nicht was ich mir nicht vorstellen kann.  

Och mann wieso geht das den nicht!? Hast du noch ne Idee? Die Msdn die du mir geschickt hab ich mir durchgelesen aber was soll ich damit die machen genauso wie mir. Ob es vielleicht doch daran liegt das wir nicht direkt auf "Masterpage" verweisen oder doch am Eriegnis "AfterSelect"? Naja ich hoffe du kennst noch irgendwas anderes oder weißt wo der Fehler steckt oder sowas ähnliches.


----------

