Entwickler-Ecke
IO, XML und Registry - Laden von Daten mit Hilfe eines Vergleichs der TreeNode und
implicit - So 14.06.09 00:39
Titel: Laden von Daten mit Hilfe eines Vergleichs der TreeNode und
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.
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;
temp = troubleshootTV.SelectedNode.Text; XmlTextReader xmltReader = new XmlTextReader(strDatei);
xmltReader.MoveToContent(); while (xmltReader.Read()) { if (xmltReader.NodeType == System.Xml.XmlNodeType.Attribute && xmltReader.Value == temp) break; } systemviewRTF.Text = ""; xmltReader.MoveToElement(); Data = xmltReader.ReadInnerXml();
this.systemviewRTF.Text = xmltReader.ReadString(); xmltReader.Close();
if (systemviewRTF.Text == "") systemviewRTF.Text = "No Results."; } |
Hier ein Auschnitt aus der XML.
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 - 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 - So 14.06.09 16:04
implicit hat folgendes geschrieben : |
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 - 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 - So 14.06.09 22:30
implicit hat folgendes geschrieben : |
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 ;) .
implicit hat folgendes geschrieben : |
Also bleibe ich beim Xmldoc. |
Was allerdings nicht LINQ to XML ist ;) ...
implicit - 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.
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.
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;
selctedNodetreeView = troubleshootTV.SelectedNode.Text; XDocument xmlDoc = XDocument.Load(filepath);
var SystemData = from Node in xmlDoc.Document.Element(@Node.Attribut["Text"]) where Node.Element(@Node.Attribut["Text"]) == selctedNodetreeView() select new { System = Node.Element("System").InnerText, Pic = Node.Element("Pic").InnerText, Data = Node.Element("Data").InnerText, }; systemviewRTB.Text = ""; foreach (var Node in SystemData) { 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"; } if (systemviewRTB.Text == "") systemviewRTB.Text = "No Results."; } |
Kha - 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:
C#-Quelltext
1: 2:
| from node in doc.Document.Elements("Node") where node.Attributes("Text").Value == ... |
implicit - 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"
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;
selectedNodetreeView = troubleshootTV.SelectedNode.Text; XDocument doc2 = XDocument.Load(filepath);
var SystemData = from node in doc2.Document.Elements("Node") where node.Attribute("Text").Value == selectedNodetreeView
select new { System = node.Element("System").Value, Pic = node.Element("Pic").Value, Data = node.Element("Data").Value, }; systemviewRTB.Text = ""; foreach (var node in SystemData) { 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"; } 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
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
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 - Mo 15.06.09 16:23
Ok selbst gefunden warum er es tut...
:)
Damit ist das thema auch fast erledigt ...
tausche
C#-Quelltext
1:
| doc2.Document.Element("Node") |
Mit
C#-Quelltext
1:
| doc2.Descendants("Node") |
Und siehe da .. es bringt daten aus den childs.. :)
Danke Kha
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!