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

DasBöse

Mitglied
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:
Code:
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
 
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):

Code:
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.
 
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):

Code:
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.

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
 
Code:
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.
 
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:
Code:
  <?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
 
Code:
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.
 
Also ich glaube jetzt haben wir´s fast. Schon mal Danke.

Code:
        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. :D

MFG
 
MoveToContent();

haben wir vergessen:

Code:
        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();
            }
 
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:
Code:
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
 
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.
Code:
        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.
 

Neue Beiträge

Zurück