Autor Beitrag
implicit
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: So 14.06.09 00:39 
Hallo,

Wieder meiner Einer. ;)

Ich habe ein kleines Issue.. sagen wir mal so .. Ich habe einen treeView mit XML Daten gefuellt.
Jetzt kommt der knifflige teil. Ich moechte nun bestimmte Subdaten aus der XML lesen, sozusagen Node.Elemente.
Dabei dient der treeView als Uebersichts hilfe und Einspring Punkt in der XML. Alles schoen und gut. Leider bekomme ich im Endeffekt nichts in der RTF geschrieben.

Nun meine Fragen.
1. Ist die Methode mit dem XmlTextReader zu empfehlen?
2. Warum bekomme ich nichts ausgelesen?

Ich haenge mal die void an, vielleicht hat ja jemand nen Auge fuer den Fehler.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
         private void troubleshootTV_AfterSelect(object sender, TreeViewEventArgs e)
              {
                string strDatei = Application.StartupPath + "\\tsdb\\troubleshoot.xml";
                string temp;
                string Data;

                // Speichere den Namen des ausgewählten Nodes
                temp = troubleshootTV.SelectedNode.Text;
                
                XmlTextReader xmltReader = new XmlTextReader(strDatei);

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

                // Lese XML solange bis die Section mit den richtigen Daten kommt
                // 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;
                 } 
                // RTF vorbereiten
                systemviewRTF.Text = "";
                
                //Dannach einfach alle Daten auslesen wie bisher
                //Erst zurück zum Element gehen

                xmltReader.MoveToElement();
                // Data string variable zu pruefen ob Reader Funzt.. --> Leider net :(
                Data = xmltReader.ReadInnerXml();

                // mit XMl reader RTF fuellen !!!
                this.systemviewRTF.Text = xmltReader.ReadString();
                xmltReader.Close();

                if (systemviewRTF.Text == "")
                    systemviewRTF.Text = "No Results.";
             }


Hier ein Auschnitt aus der XML.

ausblenden XML-Daten
1:
2:
3:
4:
5:
     
          <Node Text="DL360"/>
          <Node Text="DL360 G1" >
    <Test>Muhkuhtest</Test>
    </Node>


Bitte um Hilfe...

Danke und Gruss
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: So 14.06.09 11:52 
Hallo,

zunächst bitte ich dich, dir sauberere Formulierungen anzugewöhnen:
  • "kleines Issue": Meinst du eine Ausgabe einer Zeitung oder eine Streitfrage oder...? (Es kann auch eine korrekte Verwendung dessen sein, was du meinst; aber die Grundsprache hier im Forum ist Deutsch; also benutze bitte vorzugsweise deutsche Formulierungen.)
  • "nichts in der RTF geschrieben": RTF ist das RichTextFormat, also das Format dafür. Wie schreibt man etwas in ein Format? Du meinst doch (wie im Code ersichtlich) eine RichTextBox.
  • "Ich haenge mal die void an": void ist ein Datentyp für den Rückgabewert einer Methode. Was du da anhängen willst, ist sprachlich völlig schleierhaft.

Zitat:
1. Ist die Methode mit dem XmlTextReader zu empfehlen?

Eher nicht; denn in der SDK-Doku/MSDN steht:
Zitat:
XmlTextReader-Klasse
Stellt einen Reader dar, der schnellen, nicht zwischengespeicherten Vorwärtszugriff auf XML-Daten bietet.

Beachte: "Vorwärtszugriff". Mit MoveToElement() möchtest du zurückgehen; das geht so nicht.

Besser geeignet sein dürfte XmlDocument oder XmlDataDocument. Dort kannst mit den Select-Methoden direkt zu bestimmten Nodes gehen und diese dann untersuchen.

Übrigens ist für die Prüfung, ob ein Text leer ist, die Methode String.IsNullOrEmpty vorgesehen.

Jürgen
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 14.06.09 16:04 
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
1. Ist die Methode mit dem XmlTextReader zu empfehlen?
Warum bleibst du denn nicht bei Linq to XML :nixweiss: ? Solange du keine ultimative Performance benötigst, gibt es an XElement und co. nichts auszusetzen.

_________________
>λ=
implicit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: So 14.06.09 20:32 
Hallo Kha und
Hallo Juergen,

Die sauberen Formulierungen versuche ich mal einzuhalten. Ich dachte in einer IT community wird der Spruch, Ich habe ein Issue sehr wohl verstanden. Aber egal, mir geht es nicht darum im Deutsch verbessert zu werden sondern um Hilfe bzw. Tips beim Programmieren zu bekommen. Ich werd mich bessern ;)

Klar moechte ich in eine RTB statt format RTF schreiben.. ich dachte wahrscheinlich beim schrieben an ein RichTextField.
Hier heisst es RichTextBox.

und void hin oder her. Juergen Du weiss doch ganz genau was es ist.

Kha genau das war ja meine Frage. Ob der xmlTextReader sinnfreier oder Sinnvoller ist als der LinQ to XML.

Also bleibe ich beim Xmldoc.

Danke, werde weiter debugen, bzw. mit XmlDoc weiterversuchen.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: So 14.06.09 22:30 
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
Kha genau das war ja meine Frage. Ob der xmlTextReader sinnfreier oder Sinnvoller ist als der LinQ to XML.
Hab mich über die Frage nur etwas gewundert, da zwischen den beiden doch Welten in punkto Benutzerfreundlichkeit liegen ;) .
user profile iconimplicit hat folgendes geschrieben Zum zitierten Posting springen:
Also bleibe ich beim Xmldoc.
Was allerdings nicht LINQ to XML ist ;) ...

_________________
>λ=
implicit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 15.06.09 13:53 
hehe haste recht, wieder falsch ausgedrueckt ;) ich meine doch LinQ to XML...

Ich finde einfach nicht den Fehler :( Kannst Du kurz drueber schaun? Ich versuche von den Nodes eines treeView
das Attribut "Text" zu vergleichen mit SelectedNode.Text vom treeView. Und danach alle ChildNodes auszulesen.

aber meckert an der (@Node.Attribut["Text"]) rum, dass er den Namen Node nicht im content der Form findet.

Hier ist der Auszug aus der XML, wo er die ChildNodes mittels InnerText auslesen soll wenn ich irgend einen Node aus der treeView auswaehle.

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
          <Node Text="DL320">
            <Node Text="G1" >
        <System> DL320G1, Server</System>
        <Pic> DL320G1, Pic</Pic>
        <Data> DL320G1, Data</Data>
      </Node>
</Node>


Hier der dazugehoerige Auslese Code.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
            private void troubleshootTV_AfterSelect(object sender, TreeViewEventArgs e)
            {
                string filepath = Application.StartupPath + "\\tsdb\\troubleshoot.xml";
                string selctedNodetreeView;

                // Speichere den Namen des ausgewählten Nodes vom treeView
                selctedNodetreeView = troubleshootTV.SelectedNode.Text;
                //Lade XML Daten in die Xdoc xmlDoc aus var filepath
                XDocument xmlDoc = XDocument.Load(filepath);

                // Node.Element Attribut "Text" auslesen und mit temp vergleichen
                // Problem @Node "The name 'Node' does not exist in the current context

                var SystemData = from Node in xmlDoc.Document.Element(@Node.Attribut["Text"])
                                 where Node.Element(@Node.Attribut["Text"]) == selctedNodetreeView()
                                
                               //select data aus childesnodes
                                 select new
                               {
                                   System = Node.Element("System").InnerText,
                                   Pic = Node.Element("Pic").InnerText,
                                   Data = Node.Element("Data").InnerText,
                               };
                systemviewRTB.Text = "";
                foreach (var Node in SystemData)// RTBs fuellen !!!
                {
                    systemviewRTB.Text = systemviewRTB.Text + "System: " + Node.System + "\n";
                    systemviewRTB.Text = systemviewRTB.Text + "Pic: " + Node.Pic + "\n";
                    systemviewRTB.Text = systemviewRTB.Text + "Daten: " + Node.Data + "\n\n";
  
                } 
                // Wenn nischt da is nischt da und heisst "No Results"
                if (systemviewRTB.Text == "")
                    systemviewRTB.Text = "No Results.";
                
            }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 15.06.09 14:26 
Ich hatte mich bei deinem letzten Thema schon gewundert, dass zwar etwas merkwürdige Formatierungen benutzt, aber souverän mit Query Expressions und anonymen Klassen jonglierst - ganz sitzt es allerdings wohl noch nicht ;) .
Was soll @Node denn für eine komische Syntax sein, XPath direkt in C#?
Erst einmal würde ich die Datei nur einmal beim Start laden, es sollte statt XDocument auch ein XElement genügen.
Die Query könnte dann so aussehen:
ausblenden C#-Quelltext
1:
2:
from node in doc.Document.Elements("Node")
where node.Attributes("Text").Value == ...

_________________
>λ=
implicit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 15.06.09 14:49 
Hmm,

ok habe das mal geaendert. So sieht es eigentlich auch logischer aus...

Allerdings zeigt er mir immernoch "No Results"

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
            private void troubleshootTV_AfterSelect(object sender, TreeViewEventArgs e)
            {
                string filepath = Application.StartupPath + "\\tsdb\\troubleshoot.xml";
                string selectedNodetreeView;

                // Speichere den Namen des ausgewählten Nodes vom treeView
                selectedNodetreeView = troubleshootTV.SelectedNode.Text;
                //Lade XML Daten in die Xdoc xmlDoc aus var filepath
                XDocument doc2 = XDocument.Load(filepath);

                // Node.Element Attribut "Text" auslesen und mit temp vergleichen
                // Problem @Node "The name 'Node' does not exist in the current context

                var SystemData = from node in doc2.Document.Elements("Node")
                                 where node.Attribute("Text").Value == selectedNodetreeView

                               //select data aus childesnodes
                                 select new
                               {
                                   System = node.Element("System").Value,
                                   Pic = node.Element("Pic").Value,
                                   Data = node.Element("Data").Value,
                               };
                systemviewRTB.Text = "";
                foreach (var node in SystemData)// RTBs fuellen !!!
                {
                    systemviewRTB.Text = systemviewRTB.Text + "System: " + node.System + "\n";
                    systemviewRTB.Text = systemviewRTB.Text + "Pic: " + node.Pic + "\n";
                    systemviewRTB.Text = systemviewRTB.Text + "Daten: " + node.Data + "\n\n";
  
                } 
                // Wenn nischt da is nischt da und heisst "No Results"
                if (systemviewRTB.Text == "")
                    systemviewRTB.Text = "No Results.";
                
            }


Woran kann das liegen :)

Danek fuer den Hinweis des Doppelt laden :) hab ich net gemerkt :)

Das mit der @Node habe ich in nem anderen Forum gelesen und dachte mir das ich so den inneren Attribute text auslesen kann

ausblenden C#-Quelltext
1:
Console.WriteLine(@daten.Attributes["NAME"].InnerText);					


Beim Thema Jonglieren falle ich immernoch regelmaessig total auf die ..., da hast du recht. ;)

Vielleicht leigt es an der XML struktur ?

Hier mal die gesammte XML
ausblenden volle Höhe XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
<Node Text="Troubleshooting Tree">
  <Node Text="Proliant Server">
    <Node Text="Prodline">
      <Node Text="ML">
        <Node Text="100er Series" />
        <Node Text="300er Series" />
        <Node Text="500er Series" />
        <Node Text="700er Series" />
      </Node>
      <Node Text="DL">
        <Node Text="100er Series" />
        <Node Text="300er Series">
          <Node Text="DL320">
            <Node Text="G1" >
        <System> DL320G1, Server</System>
        <Pic> DL320G1, Pic</Pic>
        <Data> DL320G1, Data</Data>
    </Node>
            <Node Text="G2" />
            <Node Text="G3" />
            <Node Text="G4" />
            <Node Text="G5" />
            <Node Text="G5p" />
            <Node Text="G6" />
            <Node Text="Storage" />
          </Node>
          <Node Text="DL360" />
          <Node Text="DL365" />
          <Node Text="DL370" />
          <Node Text="DL380" />
          <Node Text="DL385" />
        </Node>
        <Node Text="500er Series" />
        <Node Text="700er Series" />
      </Node>
      <Node Text="BL">
        <Node Text="c-Class">
          <Node Text="200er Series" />
          <Node Text="400er Series" />
          <Node Text="600er Series" />
          <Node Text="3000er Enclosure" />
          <Node Text="7000er Enclosure" />
        </Node>
        <Node Text="p-Class">
          <Node Text="20er Series" />
          <Node Text="30er Series" />
          <Node Text="40er Series" />
          <Node Text="Enclosure" />
        </Node>
        <Node Text="e-Class">
          <Node Text="10er Series" />
        </Node>
      </Node>
    </Node>
  </Node>
</Node>
implicit Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36



BeitragVerfasst: Mo 15.06.09 16:23 
Ok selbst gefunden warum er es tut...

:)

Damit ist das thema auch fast erledigt ...

tausche
ausblenden C#-Quelltext
1:
doc2.Document.Element("Node")					

Mit
ausblenden C#-Quelltext
1:
doc2.Descendants("Node")					


Und siehe da .. es bringt daten aus den childs.. :)

Danke Kha