Entwickler-Ecke
IO, XML und Registry - Nach XML Auslesen und Vergleichen bestimmte Node zurückgeben
Dreshar - Fr 30.07.10 13:42
Titel: Nach XML Auslesen und Vergleichen bestimmte Node zurückgeben
Hallo liebe Community,
Ich versuche mich seit gestern an einem Spielchen dass ich, wie es scheint nicht gewinnen soll :D.
Es geht um folgendes. Ich hab einen dateTimePicker, eingestellt auf ShortDate (z.b 30.07.2010) dieser gehört zu einem TimeController. Mit 2 verschiedenen Buttons Vor und Zurück scrollt man das Datum +1 oder -1 Value. Zusätzlich hab ich eine Funktion die Kundendaten in eine XML per Formular schreibt, zur veranschaulichung ein Schnipsel 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: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| XmlDocument doc = new XmlDocument();
doc.Load("C:\\TimeController\\CustomerInformation.xml");
XmlElement root = doc.DocumentElement; XmlNode custName = null; XmlNode custNr = null; XmlNode custSupport = null; XmlNode custHours = null; XmlNode writeDate = null; XmlNode docID = null;
KundenName = Regex.Replace(KundenName, "(\\s+)", ""); custName = doc.CreateElement(KundenName); docID = doc.CreateElement("ID"); writeDate = doc.CreateElement("Datum"); custNr = doc.CreateElement("KundenNr"); custSupport = doc.CreateElement("Vertrag"); custHours = doc.CreateElement("Stunden"); docID.InnerText = "ID"; custName.AppendChild(docID); custName.AppendChild(writeDate); writeDate.InnerText = getDate; custNr.InnerText = KundenNr; custName.AppendChild(custNr); custName.AppendChild(custSupport); custName.AppendChild(custHours); root.AppendChild(custName);
if (support == true) { custSupport.InnerText = support.ToString(); custHours.InnerText = stundenMonat; doc.Save("path"); this.Close(); } else { custSupport.InnerText = "Nein"; custHours.InnerText = "0"; doc.Save(path); this.Close(); } |
Ergebnis ist folgendes mit Beispieldaten :
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <?xml version="1.0" encoding="utf-8" standalone="no" ?> - - <Kundeninformationen> - <Hotel Fischer> <ID>ToDo</ID> <Datum>30.07.2010</Datum> <KundenNr>1</KundenNr> <Vertrag>True</Vertrag> <Stunden>1</Stunden> </Hotel Fischer> </Kundeninformationen> |
Folgendes ist zu tun:
Ich will wenn ich das Datum des Eintrags mit selectSingleNode aufgerufen habe und es mit dem Datum des dateTimePickers verglichen habe, dass es dynamisch die Namen der Kunden in z.b einer Textbox darstellt mann man im Datum scrollt, beispielsweise:
30.07.2010
Zurück Vor
Hotel Fischer
31.07.2010
Zurück Vor
Anderer Kunde
Sorry für die schlechte veranschaulichung, ich hoffe ihr könnt euch vorstellen was ich meine.
Wie bekomm ich das jetzt hin das nachdem das Datum verglicen ist er den spezifischen Kundennamen abliest von genau dem Datensatz in dem auch das Datum steht? Gibt es so wie z.b in PHP eine funktion das ich sage Path=././" sozusagen 1 step back? Mit einer ID hab ich mir auch schon überlegt es zu lösen nur steh ich grad auf dem schlauch wie ich dann die richtig auslesen soll etc......
Vielleicht könnt ihr mir ja weiterhelfen.
Vielen Dank schonmal
Kha - Fr 30.07.10 18:29
Nimm einfach eine Schleife über alle "Hotel Fischer"-Tags (Leerzeichen in Tag-Namen? ist das valide :gruebel: ?). Dort vergleichst du dann das Datum und gibst ggf. die restlichen Unterknoten aus.
danielf - Sa 31.07.10 10:17
Hallo,
Nein, Leerzeichen sind im Tag-Namen nicht gültig.
Da ich in eile bin, hab mir nicht alles durchgelesen. Dennoch möchte ich ein paar Stichworte fallen lassen. Für Xml gibt es die sprachenunabhängige Technologin
XPath [
http://msdn.microsoft.com/de-de/library/bb675178.aspx]. Mit Hilfe deren du in einem Xml-Dokument navigieren und suchen kannst.
Ich denke das ist für deinen Fall ziemlich brauchbar.
Da kannst du eben genau Abfragen machen, zum Beispiel:
Hotels mit Datum 30.07.2010:
C#-Quelltext
1:
| var hotels = kundenInformationen.XPathSelectNodes("Hotel[Datum[text()=='30.07.2010']"); |
Die Syntax und Abfrage ist nicht richtig. Aber so ähnlich sieht es dann aus. Sehr komfortable und vor Allem auch in anderen Sprachen verwendbar. Darüberhinaus machst du 0 Zeilen Code und kannst es in der App.Config hinterlegen, falls sich mal was ändert.
Gruß
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!