Entwickler-Ecke
WinForms - Textdatei oder doch code?
Chiyoko - Di 16.03.10 00:51
Titel: Textdatei oder doch code?
huhu und sorry fuer den verwirrenden Titel.
Mein Problem ist folgendes:
Ich moechte ein neues projekt starten, in dem ich sehr viel Text verarbeiten
werde.
Es handelt sich um einen Guide...
Formaufbau:
- links treeview, rechts ein gleich aussehendes Layout, was sich theoretisch nicht
aendert.(Nur der text, dieser Steuerelemente)
- das wiederum verleitet mich, textdateien zum auslesen zu verwenden
oder waere es sinnvoller, alles als code zu schreiben?
Denn wenn der spaetere Benutzer doch mal was am text aendert, ist man angearscht.
Wenn mich nicht alles taeuscht, sind das weit ueber 10 MB an textdaten.
Ich frage mich das auch, wegen der Uebersichtlichkeit.
Eine Update funktion waere auch gut, aber das ist nebensaechlich.
Ok, hab mich fuer textdateien entschieden, frage mich aber gerade...
wie am besten auslesen, wenn man die Zeilenummern nicht kennt?
danielf - Di 16.03.10 09:28
Hallo,
ich vermute der Treeview soll zur Navigation dienen und rechts das "gleich aussehendes Layout" als Platzhalter für die Darstellung (soweit mein Résumé).
Eine Datei kannst du mit File.ReadAllLines("filename") zeilenweise als Array einlesen. Auf die jeweilige Zeile kannst du dann mit dem Array Index zugreifen.
Stehen die Informationen den schon? Was meinst du mit Textdatei? Ich denke Xml wäre als Textdatei mit Xml-Format geeigneter, weil du dann zum Beispiel auch Einträge suchen kannst etc.
Gruß Daniel
Chiyoko - Di 16.03.10 10:02
Hier mal ein Bsp zur besseren Vorstellbarkeit.
[url=
http://imgbox.de/?img=v37112b134.jpg]
[/url]
linke Seite des Buches:
- 5 label, 1 textbox
rechte Seite des Buches:
- 1 Textbox , 1 label
aber ist es sinnvoll, ueber 200 mal Texte all diesen Steuerelementen zuzuweisen?
Da hab ich ja sonst uebel viel code...
http://www.tsql.de/csharp/csharp_textdatei
->Hiermit lese ich *.txt daten ein, allerdings fehlen mir die Nummmern.
Das mit dem Array waere eine Idee, und/oder ein Strukturierter Aufbau
der textdatei.<Mhm...
Aufbau bisher als bsp. :
------------------------------
Questname: Weapon Dealer's Letter
Mission : Deliver weapons list
Reward : Exp 255 / GOLD 205
Form : Available once
NPC : Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan
Monster : None
Scenario : Please get the list of weapons that the soldiers need from Jingyo, He is guarding the south gate of Jangan.
Perhaps you don't know where that gate is? Click on the globe icon to open a local map of Jangan and find it.
Hurry.
-------------------------------
Und davon mehrere 100^^...darum auch die Frage der Strukturierung.
EDIT: Xml, d.h. online steht erstmal nicht zur debatte.
danielf - Di 16.03.10 10:31
Aufbau bisher? Heißt das nun die Textdateien (die 10Mb) sind so aufgebaut und werden so weiter aufgebaut? Oder heißt das, das ist eine Idee und die Struktur steht noch zur Frage?
Mit XML könntest du halt sowas tun:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9:
| <quests> <quest name="Weapon Dealer's Letter> <mission>Deliver wapons list</mission> <rewards> <reward type="Expt" Value="255"/> <reward type="Gold" Value="205"/> </rewards> .... </quests> |
Die Zuordnung machst du natürlich dynamisch und nicht über den Code.
Du würdest hingehen und sagen
1) ließ Xml ein
2) zeige Quests an
3) bei klick auf ein Quest, lade Quest in "Buch anzeige"
Das müsstest du dann einmal implementieren...
Aber vlt. hab ich dein Problem ja noch nicht genau verstanden :(/
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
Chiyoko - Di 16.03.10 10:51
Erstmal danke fuer die Antworten von dir^^
Die Textdaten werden alle so aufgebaut sein, ich kann sie aber beliebig anpassen.
Zumal es noch deutsch / englisch geben wird(also 2 Text daten, die ich dementsprechnend einem Index zuweise...als bsp)
Naja, ich wollte das schon spaeter als exe und online eingebunden haben, drum
wuerde sich erstmal auslesen von *.txt daten besser eignen.
z.b mit string.compare....ich weis nur nicht, welche Methode der streamreader/writer klassen die am besten geeignete waere.
In stichpunkten mal mein visueller Ablauf:
- Textdatei oeffnen
- Text einlesen
- Text vergleichen?
- wenn node angeklickt, setze auf label 1 ->string 1, label 2 ->string 2(oder eben eine array adresse
...so meinte ich das^^
Es ist auch nicht so einfach zu erklaeren, sorry...
Was XML angeht, wuerde ich gern erstmal drauf verzichten...das hatte ich nur 2 Monate und wurde mich lieber 100% auf C# konzentrieren, das Ganze offline:)
EDIT: ja, die Textdaten werden weiter aufgebaut, sind allerdings nach Level, Region oder sonstwas geordnet.(Also spaeter soll noch mehr hinzugefuegt werden)
EDIT 2: Hier mal eine Online version, was ich sozusagen uebernehme..
[url=
http://imgbox.de/?img=k13202b134.jpg]
[/url]
JüTho - Di 16.03.10 11:11
Hallo,
ich habe mit Xml auch noch nicht soviel gemacht (mehr mit richtigen Datenbanken). Aber nach deiner ganzen Beschreibung empfehle ich dringend:
Mach es mit Xml und nicht mit einfachen Textdateien! Dir geht es um inhaltlich
strukturierte Daten, und dafür ist Xml richtig vorbereitet. Bei Txt musst du alles Drumherum, jeden Zeilenaufbau, jedes Element, jeden Datentyp selbst analysieren und konvertieren. Bei Xml wird dir (fast) alles abgenommen, und du kannst dich auf die Verarbeitung der Inhalte konzentrieren.
| Zitat: |
| wurde mich lieber 100% auf C# konzentrieren, das Ganze offline |
Xml ist nur ein bestimmtes Datenformat und hat nichts (überhaupt nichts!) mit der Frage online/offline zu tun. (Das verwechselst du mit Html, aber auch das kann offline benutzt werden.) Xml kann mit 100% C# arbeiten, beginnend bei der
XmlDocument-Klasse. Daniel hat sicher noch bessere (aktuellere) Empfehlungen.
Jürgen
Chiyoko - Di 16.03.10 11:16
Oh ok, danke schoen...wieder was gelernt^^
Ja wie gesagt, hatte mich nicht lange damit beschaeftigt aber das hol ich
nach und versuch mich mit XML.
Denn Rest moechte ich mal alleine versuchen.
Wenn es geklappt hat(oder auch nicht) schreib ich es:)
Chiyoko - Di 16.03.10 12:31
So nun habe ich folgendes versucht:
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <?xml version="1.0" encoding="utf-8" standalone ="yes" ?>
<TESTXML> <questen NAME ="TEST1" ID="1" /> <questen NAME ="TEST2" ID="2" /> <questen NAME ="TEST3" ID="3" /> </TESTXML> |
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: 38:
| using System; using System.Collections.Generic; using System.Xml; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.IO; using System.Text; using System.Windows.Forms;
namespace Silkroad_quest_guide { public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) { Xml_auslesen(); } private void Xml_auslesen() { XmlDocument doc = new XmlDocument(); doc.Load(@"c:\XMLFileVersuch1.xml"); XmlElement root = doc.DocumentElement; foreach (XmlNode @questen in root.ChildNodes) { listBox1.Items.Add(@questen.Attributes["NAME"].InnerText); listBox1.Items.Add(@questen.Attributes["ID"].InnerText); } }
} } |
[url=
http://imgbox.de/?img=j22654w134.jpg]
[/url]
Ist das so richtig?
Oder gibt es noch was zu beachten?
EDIT: Ansonsten vielen Dank euch beiden, es ist gewoehnungsbeduerftig aber
vereinfacht mein Unterfangen doch sehr:)
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
danielf - Di 16.03.10 14:40
Funktional kannst es dir ja selber beantworten ;)
Hinzufügen könntest du eine Validierung mittels
Xml Schema [
http://de.wikipedia.org/wiki/XML_Schema]. Aber das ist Erstmal nicht so wichtig.
Die Verwendung von XElement laut Kha schon, weil es schneller ist. Ebenso würde ich die Struktur anpassen (siehe vorherigen post von mir). Um dann so etwas zu machen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| System.Xml.Linq.XDocument doc = XDocument.Load("blub.xml"); var quests = doc.XPathSelectElements("quests/quest");
foreach (var quest in quests) { string questName = quest.Attribute("name").Value; string mission = quest.Element("mission").Value;
var rewards = quest.Element("rewards").Elements(); } |
bzw.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| System.Windows.Forms.ListView lv = new System.Windows.Forms.ListView();
System.Xml.Linq.XDocument doc = XDocument.Load("blub.xml"); var quests = doc.XPathSelectElements("quests/quest");
foreach (var quest in quests) { System.Windows.Forms.ListViewItem lvi = new System.Windows.Forms.ListViewItem();
lvi.Tag = quest; lvi.Text = quest.Attribute("name").Value; lv.Items.Add(lvi); } |
Bei Click auf das ListView kannst du dann über das TAG-Property auf das entsprechende Xml-Tag zugreifen und es so dem "Buch bzw. der rechten Seite" übergeben wo dann die "Details" angezeigt werden.
Chiyoko - Di 16.03.10 15:44
Mhm interessant, danke:D
Das listview element war nurn bsp, ich verwende eine richtextbox
wo ich alles in einem habe.
Sozusagen 2 richtextboxen(rechts und links).
Ich werd zwar ne Weile brauchen aber nach einigen tests habs ich es bestimmt raus:)
EDIT: Eine allgemeine Frage haett ich dennoch:
XML-Daten
1:
| <quest name="Weapon Dealer's Letter"></quest><mission>Deliver Weapons list</mission> |
Was ist der unterschied zwischen "name" und ohne name?
Nun noch ein Problem
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private void Form1_Load(object sender, EventArgs e) { Xml_auslesen(); } private void Xml_auslesen() { System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml"); var quests = doc.XPathSelectElements("quest");
foreach (var quest in quests) { string questName = quest.Attribute("name").Value; string mission = quest.Element("mission").Value; var rewards = quest.Element("rewards").Elements();
richTextBox1.Clear(); richTextBox1.Text = mission; } } |
funktioniert nicht...keinerlei Fehlermeldungen.
Ich zieh mal ein tutorial zu Rate.
Denn i-wie versteh ich auch die Zeile "var quests = doc.XPathSelectElements("quest");" nicht ganz..
EDIT: habs raus^^
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
Chiyoko - Mi 17.03.10 16:03
Mhm, kann mir bitte noch jemand beantworten, wie ich auf die ID zugreife?
Bsp:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| <Janganquestliste> <Quests ID="1"> <name>Weapon Dealer's Letter</name> <mission>Deliver weapons list</mission> <Reward>Exp 255, Gold 205</Reward> <form>1</form> <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan</npc> <Monster>None</Monster> <Scenario> <ScenarioDeutsch> Bitte besorge die Waffenliste, welche die Soldaten von Jingyo benoetigen.Er verteidigt das Suedtor von Jangan. Vielleicht weisst du nicht, wo das Tor ist?Klicke auf das Erd-icon um eine Karte von Jangan zu oeffnen und finde es. Schnell! </ScenarioDeutsch> <ScenarioEnglisch> Please get the list of weapons that the soldiers need from Jingyo,He is guarding the south gate of Jangan. Perhaps you don't know where that gate is? Click on the globe icon to open a local map of Jangan and find it. Hurry. </ScenarioEnglisch> </Scenario> </Quests> |
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:
| <xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="Janganquestliste"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="Quests"> <xs:complexType> <xs:sequence> <xs:element name="name" type="xs:string" /> <xs:element name="mission" type="xs:string" /> <xs:element minOccurs="0" name="reward" type="xs:string" /> <xs:element minOccurs="0" name="Reward" type="xs:string" /> <xs:element name="form" type="xs:string" /> <xs:element name="npc" type="xs:string" /> <xs:element name="Monster" type="xs:string" /> <xs:element name="Scenario"> <xs:complexType> <xs:sequence> <xs:element name="ScenarioDeutsch" type="xs:string" /> <xs:element name="ScenarioEnglisch" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="ID" type="xs:unsignedByte" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
Ich will erreichen, das "name","mission", "reward","form","npc","monster" in einer
Textbox (also in einem String) ausgegeben werden und
ich diese per ID zuweisen kann(treeview selected node etc).
attribute("ID").Value?
Die Logoik ist mir nicht ganz klar.
Des Weiteren noch ScenarioEnglisch/ScenarioDeutsch einzeln selektieren(befhel ist mir bekannt).
Es ginge mir nur um die ID zuweisung.
Sozusagen will ich ja nicht 200 foreach schleifen benutzen, sondern nur eine einzige,
die alles ausliest, was in "Janganquesten" enthalten ist, bis auf das Scenario.
(Per Xpath die Bereiche waehlen?)
Ein schema hab ich auch erstellt, und versuche da gerade durchzusteigen.
Wenn ich ein Xml format habe, wo ist dann Xsd gespeichert oO?
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
danielf - Mi 17.03.10 16:24
Mir ist die Frage nicht ganz klar.
Attribute("ID").Value hast du ja schon gefunden.
Auch wenn ich mich wiederhole, aber du kannst auch gleich das ganze Node (Quests) ins Treeview als Tag Element packen. Dann brauchst du kein Suchen mehr und es geht dadurch natürlich viel schneller... der Speicherbedarf ist Minimal (nur die Referenz)... also nur Vorteile ;)
Wenn du da die ID hast kannst du mittels XPath dir das ID entsprechende Element aus deinem Xml holen.
C#-Quelltext
1:
| XElement quest = doc.Root.XPathSelectElement("Quests[@ID=1]"); |
oder du nimmst Linq
C#-Quelltext
1: 2: 3:
| var quest = (from q in doc.Root.Descendants("Quests") where (int) q.Attribute("ID") == 1 select q).FirstOrDefault<XElement>(); |
danielf - Mi 17.03.10 16:35
Wäre cool, wenn du deine Beiträge gleich richtig machst und nicht fünf mal editierst ;) Sonst gibt das ganze ja keinen Sinn im Nachhinein.
Über alle Quests kannst du mit:
XPath:
C#-Quelltext
1:
| var quests = doc.Root.XPathSelectElements("Quests"); |
XElement:
C#-Quelltext
1:
| var quests = doc.Root.DescendantNodes("Quests"); |
Iteration:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| foreach(var quest in quests) { int id = (int) quest.Attribute("ID"); string name = quest.Element("name").Value; ... } |
Chiyoko - Mi 17.03.10 18:56
Danke euch beiden, das langt als Info:)
Ja, und sorry wegen der verworrenden Editierung, aber mir faellt im Nachhinein immer
noch was ein:D..ich denk dran.
EDIT: Ups, i-was stimmt wohl mit meinen Augen nicht.Du bist ja nur eine PErson;)
Chiyoko - Mi 17.03.10 23:59
1)
Sorry, wenn ich nochmal nerve aber ich versteh das
mit der Uebergabe vom Tag-prop nicht.Im Internet
exestiert nicht gerade viel Info-material dazu.
2)
Und mein Problem, alles aufzulisten, hab ich endlich geloest...hat etwas gedauert aber
wenigstens gehts:D
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| private void Xml_auslesen() { System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml"); var quests = doc.Root.XPathSelectElements("Quests1");
foreach (var quest in quests) { richTextBox1.Text = quest.Value; } } |
Ausserdem muss ich die Untergruppe <Quests> Nummerieren, sonst erhalte ich immer den
letzten Node und das will ich ja nicht.
3)
Wie formatiert man Text innerhalb der Nodes?...Denn wenn ich das wie oben auflisten
moechte , hab ich natuerlich Text ohne Formatierung.
Ich versuch mich mal weiter, eine Loesung gibt es immer:D...
EDIT zu 3) 
->erledigt^^
JüTho - Do 18.03.10 10:25
| Zitat: |
| ich versteh das mit der Uebergabe vom Tag-prop nicht |
Mit Tag kann bei jedem Control ein Element von beliebigem Typ angehängt werden. Problem ist lediglich, dass Tag wegen der Beliebigkeit als object deklariert werden musste. Beim "Abfragen" dieses Wertes musst du deshalb prüfen, ob es sich wirklich um den gewünschten Typ handelt. Beispiel für TreeNode (ob ich jetzt das richtige Beispiel von Daniel für dich herausgeholt habe, weiß ich nicht, aber das Prinzip sollte klar werden):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| XElement quest = doc.Root.XPathSelectElement("Quests[@ID=1]"); node.Tag = quest;
XElement quest = node.Tag as XElement; if (quest != null) ... |
| Zitat: |
| EDIT zu 3) 
->erledigt^^ |
Als "Formatierung" meinst du nur Zeilenumbrüche? Dann benutze in WinForms (also innerhalb der RTF-Box) lieber Environment.NewLine. Die RTF-Box hat übrigens auch eine Methode AppendText; ich könnte mir vorstellen, dass du gerne damit arbeiten würdest.
Gruß Jürgen
danielf - Do 18.03.10 10:35
zu 1) welches Control hast du den nun? Ich meinte auf der linken Seite wo du die Element zur Auswahl anbietest in einem ListBox oder ListView. Die beiden Controls haben ein Tag Property (
MSDN [
http://msdn.microsoft.com/de-de/library/system.windows.forms.listviewitem_properties%28VS.80%29.aspx]). Dem kannst du dann das Node zuweisen
C#-Quelltext
1: 2: 3:
| ListViewItem lvi = new ListViewItem(quest.Element("name").Value); lvi.tag = quest; listView1.Items.Add(lvi); |
Beim klick Event dann:
C#-Quelltext
1: 2: 3: 4:
| XElement quest = (XElement) listView.SelectedItem.Tag; string mission = quest.Element("mission").Value; string reward = quest.Element("reward").Value; ... |
zu 2) Nein du musst die Untergruppe nicht Nummerieren. Das wäre total.. autsch :) Per XPath kannst du auch auf das x-te Element zugreifen:
C#-Quelltext
1:
| quests.XPathSelectElement("quest[x]"); |
Ich hoffe das hilft dir ein bisschen, den wirklich verstanden habe ich deine Probleme nicht :/
Chiyoko - Do 18.03.10 13:00
Erstmal herzlichen dank:)
Nun, ...
Mein Vorhaben:
- ich habe links ein Treeview(keine Listvew und auch keine Listbox^^) und rechts eine richtextbox
- jeder Node auf der linken Seite represaentiert eine Quest
- beim Klick auf einen Node soll auf der rechten Seite in die richtextbox der Inhalt mit der jeweiligen Quest gefuellt werden.D.h.
ich moechte <Quests></Quests> ->nur "diesen" Inhalt haben, und das pro ID..
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:
| <Janganquestliste> <Quests NAME="Weapon Dealer's Letter" ID="1"> <mission>Deliver weapons list
</mission> <Reward>Exp 255, Gold 205
</Reward> <form>1
</form> <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan
</npc> <Monster>None</Monster> </Quests> <Quests NAME="Lost Child" ID="2"> <mission>Find one of the shoes of the child taken by one eyed monsters
</mission> <Reward>Exp 375, Gold 475
</Reward> <form>1</form> <npc>Hwangno, village chief of Jangan</npc> <Monster>Small-eyed ghosts/big-eyed ghosts</Monster> </Quests> <Quests NAME="Weasel Battle" ID="3"> <mission>Hunt 40 Weasels
</mission> <Reward>Exp 1900, Gold 1000
</Reward> <form>1</form> <npc>Iyang,a guard at the east gate of Jangan</npc> <Monster>Old Weasel/ Weasel</Monster> </Quests> </Janganquestliste> |
[url=
http://imgbox.de/?img=w8285e7.jpg]
[/url]
Mein Problem war sozusagen, alle (im beispiel oben 3) Questen anzuwaehlen
C#-Quelltext
1:
| var quests = doc.Root.XPathSelectElements("Quests1/Quests2/Quests3"); |
und sie dann zuzuweisen...:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { #region Janganquesten zuweisen System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml"); var quests = doc.Root.XPathSelectElements("Quests1/Quests2/Quests3");
foreach (var quest in quests) { switch (e.Node.SelectedImageIndex) { case 0: richTextBox1.Text = quest.; break; } richTextBox1.Text = quest.Value; } #endregion |
| Zitat: |
Als "Formatierung" meinst du nur Zeilenumbrüche? Dann benutze in WinForms (also innerhalb der RTF-Box) lieber Environment.NewLine. Die RTF-Box hat übrigens auch eine Methode AppendText; ich könnte mir vorstellen, dass du gerne damit arbeiten würdest.
|
Danke, appendtext kenne ich schon...ich hatte vor diesem Projekt hier noch ein
groesseres, um so verschiedene Moeglichkeiten kennenzulernen.
Das Problem ist ehr, dass ich die Zeilenumbrueche direkt im XML brauche.
Sonst stell dir mal vor, wieviel Text das waere.
Grob gerechnet 6 Codezeilen, a 300 Questen...das ist zuviel^^
EDIT:
Ich bin jetzt soweit:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { System.Xml.Linq.XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml"); var quests = doc.Root.XPathSelectElements("Quests[@ID=1]/Quests[@ID=2]/Quests[@ID=3]");
foreach (var quest in quests) { int id = (int)quest.Attribute("ID");
string q1 = quest.Value; switch (e.Node.SelectedImageIndex) { case 20: richTextBox1.Clear(); if (id == 1) { richTextBox1.Text = q1; } break; } } } |
keine Fehlermeldung, aber es wird auch keine Textbox gefuellt.
Wenn das ginge, waer mein Problem geloest.
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
danielf - Do 18.03.10 13:34
Ich verstehe nicht woran es happert :( Du hast doch alle Bauteile zusammen und im Code brauchst du nur einmal alles Definieren.
| Zitat: |
| Grob gerechnet 6 Codezeilen, a 300 Questen...das ist zuviel^^ |
Verwirrt mich ... ???
Ob ListView, ListBox oder TreeView.. ist auch egal :(
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| XDocument doc = XDocument.Load("Janganquest.xml");
treeView1.Nodes.Add("Quests");
foreach (var quest in doc.Root.Descendants("Quests")) { TreeNode tr = new TreeNode(quest.Attribute("NAME").Value); tr.Tag = quest; treeView1.Nodes[0].Nodes.Add(tr); } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { if (e.Node.Tag != null) { XElement quest = (XElement)e.Node.Tag;
ShowQuest(quest); } }
private void ShowQuest(XElement quest) { richTextBox1.Text = string.Format("Mission: {1}{0}Reward:{2}", Environment.NewLine, quest.Element("mission").Value, quest.Element("Reward").Value); } |
Die Zeilenumbrüche kannst du direkt ins Xml machen:
XML-Daten
1: 2: 3:
| <Reward> Exp 375 Gold 475</Reward> |
Aber das würde ich dir nicht raten, weil es ja deine Datenquelle ist. Formatierung gehört da nicht hin!
Die machst du einmal in deiner ShowQuest Methode. Deshalb hatte ich dir auch geraten die Rewards zum Beispiel in Xml so darzustelen:
XML-Daten
1:
| <rewards><reward><name>Gold</name><value>475</value></reward></rewards> |
Dann kannst du im Code die Logik machen mit:
foreach (var reward in blah.XPathSelectElements("rewards/reward"))
{
whatever = reward.Element("name").Value + ": " + reward.Element("value").Value + Environment.NewLine ;
}
Moderiert von
Christian S.: Code- durch XML-Tags ersetzt
Christian S. - Do 18.03.10 13:57
Kurze Zwischenbemerkung: Es gibt im Forum XML-Tags, wäre schön wenn Ihr die benutzen würdet. Danke! :-)
Chiyoko - Do 18.03.10 15:19
@Christian
Wollte vorhin schon was schreiben, wir werden dran denken:D
@Danielf
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml");
treeView1.Nodes.Add("Quests");
foreach (var quest in doc.Root.Descendants("Quests")) { TreeNode tr = new TreeNode(quest.Attribute("NAME").Value); tr.Tag = quest; treeView1.Nodes[0].Nodes[0].Nodes.Add(tr); } |
Bin immer noch Anfaenger und halte mich gern an den Designer:p
Aber so funktioniert die Zuweisung super, wenn ich auch nicht geich
die Subnodes gefunden hatte:D
Danke dir. aber.....jetzt kann ich schlecht ein Image(index) zuweisen...
Das macht es ueber den Designer einfacher.
Und warum du mich nicht verstehst: - Ich hab eine andere Denkweise(in die wahrscheinlich falsche Richtung^^)
Aber ich denke, solangsam steig ich da durch.
danielf - Do 18.03.10 15:31
Ein image weißt du über
C#-Quelltext
1: 2: 3: 4:
| TreeNode tr; tr.ImageIndex = bzw. tr.SelectedImageIndex = |
Solche Sachen kannst du (wenn du es über den Designer gemacht hast) sofort in der <form>.Designer.cs Datei nachschauen wie er es im Code gemacht hat, die Properties durchschauen oder bei MSDN nachschauen.
Da wird nun aber schon auf der zweiten Seite sind, würde ich vorschlagen, wenn es zu diesem Thema (Textdatei oder doch code) keine Fragen mehr gibt, machst du das nächste mal einen neues Thema auf.
Chiyoko - Do 18.03.10 16:02
Sowas schau ich grundsaetzlich vorher nach.Durch den Designer erfaehrt man schon vieles:)
Aber meine Sorge war ehr, das ich nicht etliche treenodes mit imagekeys
zuweisen wollte.Das macht sich im designer einfacher.Weil die Liste statisch bleibt.
(Auf gut deutsch: Ich brauch nichts updaten).Und ich habe eine bessere uebersicht(fuer mich selbst).
Wenn ich ein neues Thema aufmache, waere das zwar uebersichtlicher aber nicht gut(wuerde der mod sagen, nehm ich an).
Aber viel mehr Fragen werden nicht kommen, hoffe ich.
Ich versuch mal, mit dem auszukommen, was ihr geschrieben habt.
Das ist schon mehr, als ich erwartet hatte^^
Chiyoko - Do 18.03.10 18:42
Ich bekomms nicht hin:(
Ich will eigentlich nur auf Quests[1] zugreifen und "innerText"
einem String zuweisen, den ich dann an die textbox uebergebe..
aber meine Versuche sind alles andere als Ueberagend.
Es ging, als ich Quests durchnummeriert hatte, ohne Nummerierung gehts
nicht...hab ich was uebersehen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { XDocument doc = XDocument.Load(@"c:\XMLFileVersuch1.xml"); var quests = doc.Root.XPathSelectElements("Quests[1]/Quests[2]");
foreach (var quest in quests) { string text = quest.Value; switch (e.Node.SelectedImageIndex) { case 20: richTextBox1.Text = text; break; } } } |
danielf - Do 18.03.10 18:55
Ich kenne die Struktur deiner Xml-Datei nicht (ändert sich ja ständig ;) ).
Aber der XPath Ausdruck würde nur funktionieren wenn das Xml so aussieht:
XML-Daten
1: 2: 3:
| <Quests> <Quests>...</Quests> </Quests> |
Ich vermute dein XPath Ausdruck sollte "/Quests/Quest[2]" sein.
Chiyoko - Do 18.03.10 20:32
Naja, eigenmtlich habe ich das am Anfang als Beispiel genommen.
Es wuerde auch das gehen:
(ohne Tags)...was aber unschoen waere..
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <Quests NAME="Weapon Dealer's Letter"> Deliver weapons list Exp 255, Gold 205 1 Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan None </Quests> |
Die Finale Version ist das hier:
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: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200:
| <?xml version="1.0" encoding="utf-8"?>
<Janganquestliste> <Quests NAME="Weapon Dealer's Letter"> <mission>Deliver weapons list
</mission> <Reward>Exp 255, Gold 205
</Reward> <form>1
</form> <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan
</npc> <Monster>None</Monster> </Quests> <Quests NAME="Lost Child"> <mission>Find one of the shoes of the child taken by one eyed monsters
</mission> <Reward>Exp 375, Gold 475
</Reward> <form>1</form> <npc>Hwangno, village chief of Jangan</npc> <Monster>Small-eyed ghosts/big-eyed ghosts</Monster> </Quests> <Quests NAME="Weasel Battle"> <mission>Hunt 40 Weasels
</mission> <Reward>Exp 1900, Gold 1000
</Reward> <form>1</form> <npc>Iyang,a guard at the east gate of Jangan</npc> <Monster>Old Weasel/ Weasel</Monster> </Quests> <Quests NAME="Yangyun's Anxiety"> <mission>Hunt 50 water ghosts
</mission> <reward>Exp 3800 / 28 HP recovery herbs
</reward> <form>1</form> <npc>Herbalist Yangyun of Jangan</npc> <Monster>Water ghost slaves/ Water ghosts</Monster> </Quests> <Quests NAME="Water ghost's poison"> <mission>Collect 20 poisons of the Water Ghost</mission> <Reward>Exp 6600 /50 MP Recovery Herbs /4000 Sp
</Reward> <form>1</form> <npc>Jangan Herbalist Yangun</npc> <Monster>Water Ghost Slave/ Water Ghost</Monster> </Quests> <Quests NAME="Sweeping Stone Ghost"> <mission>Hunt 40 Tomb ghosts
</mission> <Reward>Exp 4500 / Gold 1900
</Reward> <form>1</form> <npc>Sangnam, guard of the east gate of Jangan</npc> <Monster>broken tomb ghost/ tomb ghost</Monster> </Quests> <Quests NAME="Clearing Tomb Stone"> <mission>Collect the stone scriptures of Prajnaparamita-Hridaya-Sutra (8 kinds)</mission> <Reward>Exp 10500 / Gold 3800 / 1 lowest level transport
</Reward> <form>1</form> <npc>Buddhist Priest Jeonghye</npc> <Monster>Tomb stone ghosts</Monster> </Quests> <Quests NAME="Tree Spirit"> <mission>Collect 30 bottles of Yeoha's black blood
</mission> <Reward>Level 10 Weapon
</Reward> <form>1</form> <npc>Exorcist Miaoryeong</npc> <Monster>Decayed Yeoha/Yeoha</Monster> </Quests> <Quests NAME="Adventurer's stone"> <mission>Collect 20 Adventurer's stones
</mission> <Reward>Gold 3500 /Sp 5000 /Adventurer's shift scroll x1[Increase agility by 20%, 1h]
</Reward> <form>1</form> <npc>Jangan Adventurer Flora</npc> <Monster>Stone ghost/ Broken Stone ghost</Monster> </Quests> <Quests NAME="Sweeping Bandit Archer"> <mission>Hunt 50 Bandit Archers
</mission> <Reward>Exp 9500 / 50 MP Recovery Herbs
</Reward> <form>1</form> <npc>Juho at the military camp of Jangan</npc> <Monster>Bandit Archers/ Bandit Bowmen</Monster> </Quests> <Quests NAME="Ground Purification"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="Bandits Operational Map"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="Sweeping Bandit"> <mission>Hunt 50 Bandits
</mission> <Reward>Exp 14500 / 50 Vigor recovery herbs
</Reward> <form>1</form> <npc>Guild Manager Leebaek</npc> <Monster>Bandit Subordinate/ Bandit</Monster> </Quests> <Quests NAME="Tiger's grinding tooth"> <mission>Collect 10 Tiger's grinding teeth
</mission> <Reward>Exp 15300/ Gold 4400 / Sp 5000
</Reward> <form>1</form> <npc>Jangan Specialty Trader Jodaesan</npc> <Monster>Young Tiger/ Tiger</Monster> </Quests> <Quests NAME="Tiger hunting competition"> <mission>Hunt 1 champion Tiger 20 Tigers 20 little tigers
</mission> <Reward>Exp 6700 / 63 HP Recovery Potions(Small) Sp 2050
</Reward> <form>1</form> <npc>Jangan General Sonhyeon</npc> <Monster>little tiger, tiger, champion tiger</Monster> </Quests> <Quests NAME="Culsans Anger"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="White Tiger Hunting"> <mission>Hunt 40 white tigers
</mission> <Reward>Exp 12500 / GOLD 4300
</Reward> <form>1</form> <npc>Machun the stable keeper of Jangan </npc> <Monster>White Tiger</Monster> </Quests> <Quests NAME="Stolen Sword"> <mission>Bring back the stolen sword
</mission> <Reward>Exp 18800/ GOLD 5050 / Sp 5000
</Reward> <form>1</form> <npc>Jangan Hunter Associate Gwakwi</npc> <Monster>Bandits</Monster> </Quests> <Quests NAME="Herb Delivery"> <mission>Deliver a bundle of herbs
</mission> <Reward>Exp 14400 /GOLD 3800/ Sp 3600
</Reward> <form>1</form> <npc>Jangan Herbalist Yangyun / Chau a ticket seller at a ferry of Jangan</npc> <Monster>None</Monster> </Quests> <Quests NAME="Yangyun s Request"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="Black Tiger Claw"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="White Tiger Skin"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="Folk Remedy"> <mission>Collect 100 Chakji's eyes
</mission> <Reward>Exp 112000 /GOLD 28500 /sp Exp 25000
</Reward> <form>1</form> <npc>Jangan Ferry Ticket Seller Chau</npc> <Monster>Chakji worker/ Chakji</Monster> </Quests> <Quests NAME="Wangwon's Request"> <mission>Talk to Lottery Seller Wangwon
</mission> <Reward>None
</Reward> <form>1</form> <npc>Jangan Lottery Seller Wangwon</npc> <Monster>None</Monster> </Quests> <Quests NAME="Finding Chinese Liquor"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="Finding Europe Liquor"> <mission></mission> <Reward></Reward> <form>1</form> <npc></npc> <Monster></Monster> </Quests> <Quests NAME="Huhoan's Book"> <mission>Deliver Huhoan's account book
</mission> <Reward>Exp 320400 /GOLD 340000 /Sp 187500
/1 patience's fruit (hit ratio by 20%, parry rate by 20%, 1h)
</Reward> <form>1</form> <npc>Jangan Lottery Seller Wangwon</npc> <Monster>None</Monster> </Quests> <Quests NAME="Drinking With Huhoan"> <mission>Obtain Huhoan's account book
</mission> <Reward>Huhoan's account book
</Reward> <form>unlimited</form> <npc>Casino Guardian Huhoan of Jangan.</npc> <Monster>None</Monster> </Quests> </Janganquestliste> |
Hier mal meine letzten versuche, die aber nicht so ganz klappen.
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:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { XmlDocument doc = new XmlDocument(); doc.Load("c:/XMLFileVersuch1.xml");
XmlNodeList Quest = doc.GetElementsByTagName("Quests");
foreach (XmlNode node in Quest) { string q1 = node.ChildNodes[1].Value; switch (e.Node.SelectedImageIndex) { case 20: richTextBox1.Clear(); richTextBox1.Text = q1; break; case 21: richTextBox1.Clear(); break; } } } |
danielf - Fr 19.03.10 09:55
C#-Quelltext
1:
| XmlNodeList Quest = doc.GetElementsByTagName("Quests"); |
Hiermit bekommst du alle Element deren lokaler Name Quests ist. Das ist bei der gegebenen Xml auch das Root-Element. Also musst du entweder sagen doc.Root.Elements("Quests") oder (was ich sinnvoller fände) bei der Xml ein Quest auch als Quest zu bezeichnen und nicht als Quest
s.
Auch von der Verwendung von node.ChildNodes[1] rate ich dir ab. Die Xml-Definition sieht keine Einhaltung von Reihenfolge der Elemente vor. Sie wird zwar meistens unterstützt, aber verlassen kannst du dich darauf nicht. Deshalb gib immer den Element-Name an.
Das Dokument würde ich auch nicht an dieser Stelle laden... einmal Laden und die Referenz global merken... (bzw. elemente im Tag "verstecken"! ;))
Chiyoko - Fr 19.03.10 11:04
Guten Morgen^^
Also meinst du das so:
XML-Daten
1: 2: 3: 4: 5:
| <Quests> <Quest> <Inhalte> </Inhalte> </Quest> </Quests> |
?
C#-Quelltext
1:
| XmlNodeList Quest = doc.GetElementsByTagName("Quest"); |
Wie sollte ich denn sonst auf "alle" childnodes zugreifen?
Ich haette ja gerne alle...und will nur einmal den "ganzen"
Inhalt auslesen(also Innertext...von "mission + name+ npc etc")
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| <Quests> ->Inhalt von hier... <Quests NAME="Weapon Dealer's Letter"> <mission>Deliver weapons list</mission> <Reward>Exp 255, Gold 205</Reward> <form>1</form> <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan</npc> <Monster>None</Monster> </Quests> <---bis hier...in eine Textbox </Quests> |
und bisher funktionierte es nur einmal.Allerdings hatte ich dann den Tag "Quest"
nummeriert.
EDIT: Das der Index nicht funkioniert, habe ich gemerkt^^
danielf - Fr 19.03.10 11:26
Ja so mein ich es und der Code passt dann auch.
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9:
| <Quests> <Quest NAME="Weapon Dealer's Letter"> <mission>Deliver weapons list</mission> <Reward>Exp 255, Gold 205</Reward> <form>1</form> <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan</npc> <Monster>None</Monster> </Quest> </Quests> |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| XDocument doc = XDocument.Load("xmlfile.xml"); var firstQuest = doc.Root.Element("Quest");
int questNr = 4; var Quest = doc.XPathSelectElement(string.Format("/Quests/Quest[{0}]", questNr);
string content = firstQuest.Value; string innerXml = firstQuest.ToString(); |
wobei content dann:
Deliver weapons list
Exp 255, Gold 205
1
Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan ...
und innerXml:
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <Quest NAME="Weapon Dealer's Letter"> <mission>Deliver weapons list</mission> <Reward>Exp 255, Gold 205</Reward> <form>1</form> <npc>Chulsan the blacksmith of Jangan / Jingyo,a guard at the south gate of Jangan</npc> <Monster>None</Monster> </Quest> |
Aber du sollst NICHT auf den ganzen Inhalt einfach so anzeigen. Der Vorteil von Xml sind die Strukturierte Daten. Bitte greife doch dann auch strukturiert zu und mach eine konkrete Zuweisung und nicht einfach blumb den Inhalt.
Chiyoko - Fr 19.03.10 14:12
Danke dir, werd mich dran halten...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private void button1_Click(object sender, EventArgs e) { XmlDocument doc = new XmlDocument(); doc.Load("c:/XMLFileVersuch1.xml");
XmlNode myRootNode = doc.DocumentElement;
XmlNodeList allQuests = myRootNode.SelectNodes("./Quests"); int Questcount = allQuests.Count; MessageBox.Show("Anzahl der Questen: " + Questcount.ToString() + "!"); MessageBox.Show(allQuests.Item(0).InnerText + allQuests.Item(1).InnerText); MessageBox.Show(allQuests.Item(1).Attributes[0].Value);
} |
Allerdings gibt mir oberes Bsp endlich das, was ich die ganze Zeit wollte^^
(nur eben ueber ne message box als Text).
Du meintest zwar, das der Index nicht immer genau ist...aber wenigstens versteh
ich so das Prinzip, und arbeite mich jetzt Schrittweise vor.
Danke fuer deine Zeit und Hilfe:)
danielf - Fr 19.03.10 14:40
Wenn du meinst... :((
Hab dich auch gesagt du sollst XDocument, XElement und Co verwenden, nicht XmlDocument& CO ...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| XDocument doc = XDocument.Load("C:/XMLFileVersuch1.xml"); var quests = doc.Root.Elements();
MessageBox.Show("Anzahl der Quests: " + quests.Count<XElement>()); MessageBox.Show(quests.ElementAt<XElement>(0).Value); MessageBox.Show(quests.ElementAt<XElement>(1).Value); MessageBox.Show(quests.ElementAt<XElement>(0).Attribute("NAME").Value); |
Chiyoko - Fr 19.03.10 14:49
Oh...da hast du Recht, danke schoen.Dann fahr ich in dieser Richtiung weiter:)
Wieso ist der Unterschied denn so gravierend??
danielf - Fr 19.03.10 14:54
danielf hat folgendes geschrieben : |
Die Verwendung von XElement laut Kha schon, weil es schneller ist. |
Außerdem Implementiert es neue Schnittstellen und ist zu komfortabler.
Chiyoko - Fr 19.03.10 15:08
und komplizierter;)...aber ich versuchs damit weiter.
Und ...das ich auf die Attribue einzeln zugreife...
Am besten waere doch immer noch eine ID oder?
Pseudocode:
- lade Xml
- deklariere
- selektiere Xpath node(Quest[@id="1"]/Quest[@id="2"]etc)
- foreach-> innertext von mission, name etc auflisten
switch(e.node.selectedImageIndex)
case:...
if(quest id == 1)->je nach ID konoten waehlen
mission + name + etc in richtextbox
Chiyoko - Fr 19.03.10 15:43
Ja...deine Links haben mich ueberzeugt:D...ich hab es teilweise auch durch meine googlesuche selbst gesehen aber nie drauf geachtet.
Ok, ID und foreeach ueberfluessig...^^
Mehr Elemente werden es auch nicht, nur die Questanzahl steigt locker auf 300.
Und es werden spaeter noch mehr.
Also waere das sinnvollste doch der index um alles der textbox zuzuweisen, je nach
selektierter "treeview"-nodes?
->So waere es fuer mich am einfachsten aber ich muss ja noch an
spaeter denken, es soll ja auch online genutzt werden...
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| XDocument doc = XDocument.Load("C:/XMLFileVersuch1.xml"); var quests = doc.Root.Elements();
string quest1 = quests.ElementAt<XElement>(0).Value); string quest2 = quests.ElementAt<XElement>(1).Value);
|
Da faellt mir ein, bei meinem letzten Projekt hatte ich ein aehnliches Problem.
um alle MIDI dateien aus einem Ordner zu lesen und zu selektieren
haette ich ueber 400 strings deklarieren muessen...nach ueber 1 monat hat ich es dann
endlich raus:D
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| private void listView1_SelectedIndexChanged(object sender, EventArgs e) { try { foreach (ListViewItem item in listView1.SelectedItems) { string path = Application.StartupPath; if (FF7 == true) { path = path + "\\Bilder\\FF7\\Music\\cd1\\" + item.Text; } if (FF8 == true) { path = path + "\\Bilder\\FF8\\Music\\cd1\\" + item.Text; } if (FF9 == true) { path = path + "\\Bilder\\FF9\\Music\\cd1\\" + item.Text; } if (FF10 == true) { path = path + "\\Bilder\\FF10\\Music\\cd1\\" + item.Text; }
if (listView1.SelectedItems.Count != 0) axWindowsMediaPlayer1.URL = path; } axWindowsMediaPlayer1.Ctlcontrols.play(); } catch (Exception e1) { MessageBox.Show(e1.Message); } } |
Chiyoko - So 21.03.10 17:09
Ich hab mir gedacht, ich loese das nun ueber eine Schleife
die die Anzahl der Elemente hochzaehlt und dann je nach Attribute
ausgibt.
Relativ, ob ich dabei dann (Value) fuer "gebe alles aus" verwende
oder eben einzeln auf die 4 attribute zugreife.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void button1_Click(object sender, EventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.Root.Elements();
for (int i = 0; i < quests.Count<XElement>(); i++ ) { MessageBox.Show(quests.ElementAt<XElement>(i).Value);
} } |
Kha - So 21.03.10 17:56
Ich habe den Überblick verloren, was du eigentlich erreichen willst, aber wie wäre es mit einer foreach-Schleife, die ggf. einen Index mit hochzählt?
Chiyoko - So 21.03.10 19:28
Nunja...
Ich habe ja Questen.Diese Unterteilen sich in Abschnitte.
Und zwar:
mission, reward,name,form, monster
Alle 5 Abschnitte sind eingegrentzt mit
<Quest> Tags.
XML-Daten
1: 2: 3: 4: 5: 6: 7:
| <Quests> <Quest> <name></name> <monster></monster> <....> <Quest> <Quests> |
Ich wollte nun alle 5 Abschnitte "1ner Quest" in einer Textbox
wiedergeben, je nachdem welchen Treenode man angeklickt hat.
Und zwar den Value wert von
<Quest>.
Als Attribute von
<Quest> habe ich "name" und "ID" festgelegt.
Ueber diese Attribute und eine foreach schleife(oder for)
wollte ich dann den Value wert auslesen
(Wenn
<Quest> ausgewaehlt UND ID == 1 dann setze genau die Quest
von ID 1 in die Textbox).
Und dann kam ich leicht durcheinander mit den ganzen Moeglichkeiten zum
auslesen, ganz abgesehen von der Methode zum auslesen des XML documents.
(nicht "xml" sondern "x").
Ich hoffe, die Zusammenfassung erklaert das gut^^
Moderiert von
Christian S.: Color- durch Xml-Tags ersetzt
Chiyoko - Mo 22.03.10 12:27
So, ich habs versucht...auf verschiedenen Wegen aber mir wird immer nur
die erste Quest ausgegeben.Danach bekomm ich einen Error, der wie folgt lautet:
Index ausserhalb des Wertebereichs....
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:
| private void button1_Click(object sender, EventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");
foreach (var quest in quests) { int id = (int)quest.Attribute("ID");
string questName = quest.Element("name").Value; string mission = quest.Element("mission").Value; string reward = quest.Element("Reward").Value; string form = quest.Element("form").Value; string npc = quest.Element("npc").Value; string monster = quest.Element("Monster").Value;
MessageBox.Show(quests.ElementAt<XElement>(id).Value); id++;
} } |
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| <Chinaquesten> <Janganquestliste> <Quests> <Quest ID="1"> <name>Weapon Dealer's Letter</name> <mission>Deliver weapons list</mission> <Reward>Exp 255, Gold 205</Reward> <form>1</form> <npc>Chulsan(Jangan blacksmith) / Jingyo</npc> <Monster>None</Monster> </Quest> </Quests> ...etc <Janganquestliste> <Chinaquesten> |
JüTho - Mo 22.03.10 12:46
Zunächst wäre es hilfreich zu wissen, an welcher Stelle genau der Fehler auftritt. Auch weiß ich nach wie vor nichts zu deinem Vorgehen (das ist meine Schuld, nicht deine); aber mir fallen diese Punkte auf:
1. Die int-Variable id wird am Anfang des Blocks deklariert und bekommt eine Zuweisung durch das Attribut; und dann wird dieser Wert zur Abfrage des Value benutzt. Ist das so gewünscht?
2. Danach wird der Wert um 1 erhöht, und dann ist der Block zu Ende. Im nächsten Schleifendurchgang wird id wieder neu deklariert, wozu also id++?
3. Entweder id wird als zusätzliche Schleifenvariable benutzt; dann muss sie vor der Schleife deklariert werden und darf innerhalb der Schleife nur durch id++ geändert werden, aber sonst keinen neuen Wert zugewiesen bekommen. Oder du benutzt nur den Attribut-Wert. Oder du benutzt zwei verschiedene Variable.
Gruß Jürgen
Chiyoko - Mo 22.03.10 13:23
Danke, ich habs raus.
Ich hab mit "1" bei ID zum zaehlen angefangen und nicht bei "0".
Ich wusste zwar, das man immer bei 0 anfaengt aber nicht, das
das auch bei ID festgelegt sein muss.
Allerdings werden mir nur 2 Questen per messagebox ausgegeben.
Zu 1)
Ja das ist so gewuenscht, da ich alle daten auf einmal haben moechte.
Allerdings aendert sich das noch, da es laut Danielf weniger elegant ist.
Mein Vorgehen habe ich doch erklaert oder?(Noch genauer kann ich es eigentlich
nicht beschreiben:)...bzw wuesste ich nicht, wie^^)
Ich hab auch vorher extra Bilder gemacht, damit es visuell verstandlich ist.
Zu 2)
Stimmt, aber ich bin kein schleifen profi:D...mir fehlt da noch etwas die Routine.
zu 3)
Ich wollte eigentlich nur ID hochzaehlen..
<Quest ID="0">...
Und Danielf schrieb, ich soll sowas wie:
C#-Quelltext
1:
| int id = (int)quest.Attribute("ID"); |
nehmen..
Und das innerhalb der foreach schreiben.
Und was 1) angeht, nochmal ne kurzerklaerung.Denn ich brauch ja die Hilfe, nicht du;)
Den Inhalt von ->
<Quest ID= "0"></Quest>, <Quest ID="1"></Quest>
will ich auslesen, und zwar nach dem Attribute ID am besten(reihenfolge egal).
Indem ich dann abfrage, welche ID(welcher node) selektiert wurde, kommt der jeweilige
Inhalt in die Textbox.
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:
| <Chinaquesten> <Janganquestliste> <Quests> <Quest ID="0"> <name>Weapon Dealer's Letter
</name> <mission>Deliver weapons list
</mission> <Reward>Exp 255, Gold 205
</Reward> <form>1
</form> <npc>Chulsan(Jangan blacksmith) / Jingyo
</npc> <Monster>None</Monster> </Quest> </Quests> <Quests> <Quest ID="1"> <name>Lost Child
</name> <mission>Find one of the shoes of the child taken by one eyed monsters
</mission> <Reward>Exp 375, Gold 475
</Reward> <form>1
</form> <npc>Hwangno, village chief of Jangan
</npc> <Monster>Small-eyed ghosts/big-eyed ghosts</Monster> </Quest> </Quests> <Janganquestliste> <Chinaquesten> |
Und schon hab ich mein Fehler gefunden-.-
Ich hab ein Tag vergessen....
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| private void button1_Click(object sender, EventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");
int a = 0; foreach (var quest in quests) { MessageBox.Show(quests.ElementAt<XElement>(a).Value); a++; } } |
JüTho - Mo 22.03.10 14:20
Chiyoko hat folgendes geschrieben : |
| Danke, ich habs raus. |
Prima, ich gratuliere! - Zum fehlenden Verständnis meinerseits:
Chiyoko hat folgendes geschrieben : |
| Mein Vorgehen habe ich doch erklaert oder?(Noch genauer kann ich es eigentlich nicht beschreiben:)...bzw wuesste ich nicht, wie^^) |
JüTho hat folgendes geschrieben : |
| ...das ist meine Schuld, nicht deine |
:mrgreen:
Jürgen
Chiyoko - Mo 22.03.10 16:15
aw^^
Aber ich hab noch eine Frage:
Wie kann ich nun mit vorhandenen Code auf den jeweiligen Value wert zugreifen?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");
int a = 0; foreach (var quest in quests) { string questen = quest.Value; das einzeln haben moechte?(siehe unten->Questzuweisung) a++; switch (e.Node.SelectedImageIndex) { case 20: RTBclear(); if (a == 0){ richTextBox1.Text = questen; }break; case 21: RTBclear(); if (a == 1) { richTextBox1.Text = questen; } break; } } } |
EDIT:
Komisch....ueber switch/case kann ich den Index nicht durchschalten??!!...
Auskommentierte Zeilen gehen nicht, aber die if/else iretation funktioniert...
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:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");
for (int i = 0; i < quests.Count<XElement>(); i++) { string questen = quests.ElementAt<XElement>(i).Value; if (e.Node.SelectedImageIndex == 20) { if (i == 1) { richTextBox1.Text = questen; } } else if (e.Node.SelectedImageIndex == 21) { if (i == 2) { richTextBox1.Text = questen; } } } } |
Chiyoko - Mi 24.03.10 00:19
So genug gestresst:D...ich hab es auch so hinbekommen, wie Danielf das erklaert hatte.
Nur die formatierung fehlt noch aber die sollte np sein.
Danke fuer die ganze Hilfe.
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: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");
foreach (var quest in quests) { for (int i = 0; i < quests.Count<XElement>(); i++) { string name = quest.Element("name").Value; string mission = quest.Element("mission").Value; string reward = quest.Element("Reward").Value; string form = quest.Element("form").Value; string npc = quest.Element("npc").Value; string monster = quest.Element("Monster").Value; string scenDE = quest.Element("ScenarioDeutsch").Value; string scenENG = quest.Element("ScenarioEnglisch").Value;
if (e.Node.SelectedImageIndex == 20) { if (i == 0) { RTBclear(); richTextBox1.Text = questen;
pictureBox1.ImageLocation = Path.Combine(Application.StartupPath, @"Bilder\bigeyedghost.jpg"); if (DE == true && ENG == false) { richTextBox2.Clear(); richTextBox2.Text = "!!!!!"; } if (ENG == true && DE == false) { richTextBox2.Clear(); richTextBox2.Text = "???"; } } } if (e.Node.SelectedImageIndex == 21) { } } } } |
danielf - Mi 24.03.10 00:36
Hmm... so hab ich das nicht gesagt (wehr) ;)
Die zweite (// alle Elemente) Schleife ist total unnütz, bzw. doppelte gemoppelt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| foreach (var quest in quets) { string name = quest.Element("name").Value; string mission = quest.Element("mission").Value; string reward = quest.Element("Reward").Value; ... } |
reicht völlig aus. Ich würde dir auch einen QuestWrapper vorschlagen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| public class QuestWrapper { public XElement Quest { get; set; }
public string Name { get { return Quest.Element("name").Value; } }
public string Mission { get { return Quest.Element("mission").Value; } }
....
public QuestWrapper() {
}
public QuesetWrapper(XElement quest) { Quest = quest; } } |
Dann wäre dein Code nicht nur wiederverwendbar sondern auch "eleganter".
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| QuestWrapper questObj = new QuestWrapper(); foreach (var quest in quests) { questObj.Quest = quest;
lQuestName.Text = questObj.Name; lQuestMission.Text = questObj.Mission; .... } |
Dann könntest du auch bequem dein Sprach-Handling damit abhacken:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| public class QuestWrapper { public XElement Quest { get; set; }
public string Language { get; set; }
public string Name { get { return Quest.XPathSelectElement(string.Format( "name[@language={0}]", Language)); } } } |
Aber das nur als Ausblick ;)
Kha - Mi 24.03.10 01:02
danielf hat folgendes geschrieben : |
| Ich würde dir auch einen QuestWrapper vorschlagen: |
...und spätestens dann würde ich ausprobieren, ob man über XML-Serialisierung nicht schneller ans Ziel kommt ;) .
Chiyoko - Mi 24.03.10 03:05
Ihr seid mir 2...:D:..
Herzlichen Dank, (das ich da auch nich selber drauf gekommen bin-.-)
Hatte das schon mit einer String klasse gemacht
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:
| public class getStrings { string[] getstrings = { "Bilder\bigeyedghost.jpg" };
public string[] Elements { get { return getstrings; } }
public string this[int index] { get { return getstrings[index]; } } } |
aber die mochte mich nicht so ganz:D...am ende lag der Fehler ganz woanders.
Naja ich schau morgen nochmal drueber, gute nacht:)
Chiyoko - Mi 24.03.10 12:48
Die 2te Schleife mag unnutz sein, aber ich komm damit wenigstens einfach an
den index.Mit deinen Methoden klappte das nie wirklich...(dank meines unwissens;))
Darum hab ich jetzt einfach noch
<id>x</id> hinzugefuegt
und greife dann ueber den namen anstatt ueber die ID darauf zu.
Nun, ich hab das jetzt mit der Klasse getestet-...und bekomm einen Error.
C#-Quelltext
1: 2: 3: 4:
| public QuesetWrapper(XElement quest) { Quest = quest; } |
Nicht alle codePfade geben einen Wert zurueck(?)
using direktive sind alle definiert, ansonsten wuesste ich jetzt nicht,
was da noch fehlen koennte oO...
danielf - Mi 24.03.10 13:25
Ist es korrekt geschrieben? Das sollte ein überladener Konstruktor sein...
danielf - Mi 24.03.10 15:24
:((
Der Screenshot und den Code den du geposted hast unterscheiden sich.
1) FALSCH geschrieben !
2) Kein Konstruktor, sondern du hast eine Methode drauß gemacht!
Reg mich grad echt auf, weil diese Fehler kannst du verhindern :((
und bitte schau dir die Grundlagen von OOP an (
C# [
http://openbook.galileocomputing.de/csharp/] Kapitel 2).
Chiyoko - Mi 24.03.10 15:48
Sorry aber ohne den zusatz von string bekam ich auch ein Fehler.
ist ja nicht so, das ich mir nicht anschau, was ich da mache.
Was die Grundlagen angeht, schau ich zwar oft drueber aber man merkt sich ja nicht
alles gleich.
Und jetzt weis ich wenigstens, wieso der Fehler auftrat^^Ich hab deinen
Schreibfehler uebersehen, bzw gedacht...es ist beabsichtigt.
(Beim 2ten Konstruktor)
EDIT: Mit Klassen hat ich noch nicht viel zu tun.
ich lese mir mal das Galileo Kapitel durch.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public class QuestWrapper { public XElement Quest { get; set; }
public string Name { get { return Quest.Element("name").Value; } }
public QuestWrapper() {
}
public QuestWrapper(XElement quest) { Quest = quest; } } |
Chiyoko - Do 25.03.10 13:22
Naechstes Problem:
Auf einmal heisst es, ich haette keine Instanz festgelegt(?).
Kann nicht sein, weil ich an der Klasse nichts mehr geaendert hatte.
[url=
http://imgbox.de/?img=x11452w214.jpg]
[/url]
Ich habe mehrfach die Xml datei geprueft, stimmt alles.
Ueber die Instanzierung und eine Messagebox dann versucht, auf die Daten
zuzugreifen.(Was vorher ja auch noch funktionierte)
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| private void button1_Click(object sender, EventArgs e) { XDocument doc1 = XDocument.Load("C:/Chinaquesten.xml"); var quests = doc1.XPathSelectElements("Chinaquesten/Janganquestliste/Quests/Quest");
QuestWrapper tester = new QuestWrapper(); foreach (var quest in quests) { string test = tester.REWARD; MessageBox.Show(test); } } |
danielf - Do 25.03.10 14:41
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| QuestWrapper tester = new QuestWrapper(); foreach (var quest in quests) { tester.Quest = quest; string test = tester.REWARD; MessageBox.Show(test); } |
Chiyoko - Do 25.03.10 15:54
Danke abermals, ..aber wieso muss man das nochmal deklaieren, wenn
man das schon im konstruktor hat?
danielf - Do 25.03.10 15:58
Weil der Konstruktor nur eine Hülle (Wrapper) um das XElement ist. Mit dem Konstruktor erstellst du eben nur die besagte Hülle ohne Inhalt. Den Weißt du nun in der For-Schleife zu und kannst mit den Wrapper-Methoden "bequem" auf den Inhalt zugreifen.
Chiyoko - Do 25.03.10 16:15
Merk ich mir.Herzlichen dank.
Kha - Do 25.03.10 17:09
Chiyoko hat folgendes geschrieben : |
Danke abermals, ..aber wieso muss man das nochmal deklaieren, wenn
man das schon im konstruktor hat? |
Wenn du einen Konstruktor hast, dann nutz ihn doch auch ;) ?
C#-Quelltext
1:
| MessageBox.Show(new QuestWrapper(quest).REWARD); |
Die paar zusätzlichen Instanzen dürften sich im Vergleich zu I/O nicht bemerkbar machen.
PS: WARUM SCHREIEN DEINE PROPERTY-NAMEN SO :D ?
Chiyoko - Do 25.03.10 17:38
Viele Wege fuehren nach Rom:D
Danke^^
Ich habe diese Namen gros geschrieben, weil ich alle Fehler ausschliessen wollte.
Und da ich genau weis, das ich Namen normalerweise nie auf die Art deklariere,
waere das so ein moeglicher Fehler weniger:p
Und hier mal eine geupdatete Version:
(Es wird sich nicht mehr allzuviel aendern.)
[url=
http://imgbox.de/?img=m37738l214.jpg]
[/url]
Fehlt noch die Formatierung des Textes, aber sonst funktioniert es einwandfrei:)
Chiyoko - Di 13.04.10 23:59
Huhu, ich hab noch ein kleines Problemchen.
Wenn ich Text in Xml auslesen moechte, in die Richtextbox uebergebe, dann bleiben
bloederweise einige Leerzeichen am anfang und das sieht nicht gut aus.
Mir welcher Methode kann ich diese entfernen?
-> so entsteht die formatierung
XML-Daten
1: 2: 3:
| <Text> Hier steht der Text </Text> |
-> so passiert das nicht, aber manchmal verschiebts ich das wie oben...
XML-Daten
1: 2:
| <Text>Hier steht der Text </Text> |
danielf - Mi 14.04.10 08:09
Bitte beginn einen neuen Thread. Dieser ist schon unübersichtlich genug auch ohne ein neues Thema :)
Stell dir vor du kennst die anderen Beiträge noch nicht und musst Erstmal 4 Seiten durchlesen um evtl. alle Informationen zu bekommen. Dieses Thema hat ja auch nichts mehr mit dem ursprünglichen Thread zu tun.
Wenn du eine XML-Datei zum Beispiel im InternetExplorer anschaust wird die automatisch formatiert.. wenn es dir um die "XML"-Formatierung geht, hilft nur ein Texteditor. Wenn du die Xml Datei erzeugst, kannst du beim Speichern angeben, ob die Xml-Datei formatiert sein soll... da ein false, das sollte helfen (wenn du die Datei mit einem Programm erstellst oder editierst).
Chiyoko - Mi 14.04.10 09:06
Danke dir und ja mach ich bei einer naechsten Frage^^
Chiyoko - So 02.05.10 23:50
Huhu, ich haett da noch eine Frage zu Xml,...
ich soll ja "X" statt "Xml" verwenden, aber ich finde keine Moeglichkeit,
bestimmte Knotennamen auszulesen.
Bei Xml war es ja SelectElementByTagName.
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <Parent1> <child1> <child> <name>inhalt</name> </child> </child1> <child2> <child> <name>inhalt</name> </child> </child2> </Parent1> |
So, wie komm ich jetzt an "alle" Tags mit dem namen "child"?
Mit Decendants geht es auch nicht, ich ja die childs in 2
verschiedenen Parents brauche.
Ich moechte im endeffect nur eine foreach schleife haben,
wo mir dann alle Knoten mit dem Tag namen "child" aufgelistet
werden....dementsprechend auch nur einen String.
Danke
#
EDIT:
* The "//" shorthand causes a document-wide scan of all nodes.
* The "[]" predicate runs in a loop, once for each <person> matched by "//person".
* The second "//" causes a causes a document-wide scan again, this time once for each <person>.
gerade gefunden,..mal schauen, was sich machen laesst.
Geklaert:
var Q_China = doc3.XPathSelectElements("//Mob[@name]");
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 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!