![]() |
suche in xml
hi all
ich durchsuche meine .xml mithilfe von
Delphi-Quellcode:
jedoch ist es nun fascht logisch, das ein Eintrag in der .xml welcher z.B.: Thomas ist nich durch thomas gefunden werden kann.. kann mer hier jemand helfen
nl:= xmldoc.selectNodes('/*/*[contains(name,"'+LabeledEdit1.Text+'")]');
|
Re: suche in xml
Du kannst mit lowercase alle Buchstaben in kleinbuchstaben umwandeln. (oder anders mit upperCase alles in groß)
Delphi-Quellcode:
mfg
lowercase(Suchbegriff)=lowerCase(Xml-eintrag)
edit: ![]() |
Re: suche in xml
delphi sagt mir aber, dass uppercase und lowercase nicht xmldoc komp. sind
habe ich auch schon probiert |
Re: suche in xml
Wie nicht kompatibel? Du kannst ja den Eintrag aus der DB auslesen überprüfen und verarbeiten. Also, dass du z.B. den Eintrag in ne Varibale kopierst (oder geht dat net?) und dann mit
![]() mfg |
Re: suche in xml
habe das ganze jetzt mal so versucht
Delphi-Quellcode:
jedoch gibt er mir immer noch nichts heraus, wenn ich "thomas" klein schreibe
nl:= xmldoc.selectNodes('/*/*[contains(name,"'+LabeledEdit1.Text+'")]');
for i := 0 to nl.length - 1 do begin str1 := nl.item[i].text; str2 := LabeledEdit1.Text; if lowercase(str1) = lowercase(str2) then [edit] weitere infos zugunsten von bttb
Delphi-Quellcode:
statt /*/* könnte ich auch /<datenbank>/<eintraege> schreiben
xmlDoc: IXMLDOMDocument2
|
Re: suche in xml
was machst du da überhaupt? was für ein typ ist xmldoc? Ich kenne den SelectNodes-Befehl gar nicht (IXMLDocument und TXMLDocument haben den nicht). Und was soll der merkwürdige Kram im String? (mit den /*/* usw?)
Ohne diese Infos wird Dir keiner helfen können. |
Re: suche in xml
Ich möchte zwar nicht unhöflich klingen, aber wenn du mit den Infos nichts anfangen kannst, dann häng dich einfach nicht rein. :roll: Oder mach dich vorher zum Thema XML, XPath, usw. schlau, wenn du gern helfen möchtest.
Ich sehe da nichts Ungewöhnliches. Ich habe auch nur keine Lösung, weil XML nun mal zwischen Groß- und Kleinschreibung unterscheidet, und weil man daher (IMHO und jetzt auf die Schnelle behauptet) mit Bordmitteln nicht weiterkommt. Falls mir zufällig im XML-SDK eine Lösung begegnet, ob man auch unabhängig von der Schreibweise nach Knoten suchen kann, sage ich Bescheid. |
Re: suche in xml
Kannst du sonst deine Suche nicht zweimal laufen lassen, einmal mit klein und einmal mit großem Anfang?
Oder ist es auch wahrscheinlich, das ein Buchstabe mitten im Wort groß geschrieben ist? Czapie. |
Re: suche in xml
Es geht nicht um die Frage der Wahrscheinlichkeit, sondern es geht um die Eingabe des Anwenders. Ich kann entweder Thomas eintippen, oder aber thomas. Ich kann auch aus Versehen auf die Shift-Taste kommen, so dass im Eingabefeld dann ThoMAs steht. Oder komplett in Großbuchstaben.
@mav: Sag mal, suchst du nach Knotennamen? Ich wundere mich, weil sich "name"
Code:
doch nicht auf den Inhalt sondern auf den Namen des Knotens selbst bezieht. Aber dann müsste deine XML-Datei ja so aussehen:
/*/*[contains([b]name[/b],"'+LabeledEdit1.Text+'")]
XML-Code:
Richtig? Wenn möglich, dann überdenke diesen Aufbau noch einmal. Du machst dir das Leben damit noch schwerer. Wenn du in deiner Datei mehrere Leute hast, die Thomas heißen, dann musst du sowieso weitere Daten heranziehen, um einen von ihnen zweifelsfrei erkennen zu können. Sonst änderst du den falschen Knoten.
<datenbank>
<Thomas> </Thomas> </datenbank> Ich weiß nicht, was du programmierst. Vermutlich ein Adressbuch. Aber da würde ich einen anderen, allgemeineren Aufbau der Datei benutzen, schon allein um die Suche zu erleichtern. Nehmen wir an, du hast folgenden Aufbau:
XML-Code:
und du willst jetzt in einer Art Suchfunktion alle Namen anzeigen lassen, in denen Thomas vorkommt. Dann kannst du erst mal mit
<datenbank>
<person> <name>Thomas Maier</name> </person> <person> <name>Thomas Müller</name> </person> </datenbank>
Code:
alle Knoten finden, in denen auch ein Name drin steht. Und in einer Schleife prüfst du dann den Inhalt des Knotens (node.text oder node.value; eins von beiden jedenfalls :oops:). Und hier lassen sich dann auch
/datenbank/person/name
![]() ![]() ![]() Das ist IMHO einfacher, als ein XML-Format zu nutzen, bei dem man die Namen von Personen als Knotennamen benutzt. |
Re: suche in xml
also meine .xml ist so aufgebaut
Delphi-Quellcode:
<tester_db><tester><name>Thomas</name></tester></tester_db>
|
Re: suche in xml
Aha. Na ja, dann mach´s wie ich vorgeschlagen habe:
Code:
mit "selectNodes", und du hast alle (wenn es mehrere sind) Namen in IXMLDOMNodeList. Den Rest machst du wie vorgeschlagen in einer Schleife.
/tester_db/tester/name
|
Re: suche in xml
ok.. dein vorschlag hört sich logisch an.. funktioniert aber bei mir noch nicht ganz :(
Delphi-Quellcode:
nl:= xmldoc.documentElement.selectNodes('tester_db/tester/name');
for i := 0 to nl.length - 1 do begin if lowercase(nl.item[i].nodeValue) = lowercase(LabeledEdit1.Text) then subNode := nl.item[i].selectSingleNode('id'); ListView1.Items.Add; ListView1.Items[i].Caption := subNode.text; with ListView1.Items[i].SubItems do begin subNode := nl.item[i].selectSingleNode('name'); if subNode <> nil then Add(subNode.text); |
Re: suche in xml
Zitat:
XML-Code:
Tut sie aber bestimmt nicht. Bitte beachte, dass du dich mit der XPath-Anweisung
<tester_db>
<tester> <name> Thomas <name>?</name> <id>?</id> </name> </tester> </tester_db>
Code:
auf der Ebene von <name> befindest. Das jeweilige Item in "nl.item[i]" entspricht also dem <name>-Knoten, und du suchst mit deinem Code dort jetzt untergeordnete <id>- und <name>-Knoten. Ohne Nachgucken ist es etwas schwierig (weil aus dem Kopf), aber es müsste eine "parentNode"-Eigenschaft geben, die auf den übergeordneten <tester>-Knoten verweist. Benutze den, und dein Code sollte funktionieren. ;)
/tester_db/tester/name
Nebenbei vermisse ich nach der if-Prüfung das begin/end, denn wenn der Name identisch ist, dann sollen sicher alle der nachfolgenden Anweisungen ausgeführt werden, und nicht nur Zitat:
|
Re: suche in xml
ok.. die genau fehler beschreibung heisst..
"Variante des Typs (NULL) konnte nicht in den Typ (String) konvertiert werden." und der Fehler weist auf folgende zeile hin
Delphi-Quellcode:
das ganze sieht jetzt so aus...
if lowercase(nl.item[i].nodeValue) = lowercase(LabeledEdit1.Text) then begin
Delphi-Quellcode:
nl:= xmldoc.documentElement.selectNodes('/movies_db/mov/name');
for i := 0 to nl.length - 1 do begin ListView1.Items.BeginUpdate; ListView1.Clear; if lowercase(nl.item[i].nodeValue) = lowercase(LabeledEdit1.Text) then begin MessageDlg('Eintrag gefunden', mtConfirmation, [mbYes,mbNo], 0); end; ListView1.Items.EndUpdate; end; |
Re: suche in xml
Hast du das Platform SDK auf der Platte? Oder die Hilfedatei, die bei MS-XML dabei war? Dann schau dir mal die Angaben zu nodeValue von
![]() Und, äh, ...
Delphi-Quellcode:
solltest du nicht in der Schleife drin haben.
ListView1.Items.BeginUpdate;
ListView1.Clear; |
Re: suche in xml
so.. nach langem hin und her hab ich jetzt mal dieses hier versucht..
Delphi-Quellcode:
jedoch überschreited jetzt der listenindex max.(5) und ich finde den fehler nicht :(
begin
ListView1.Items.BeginUpdate; ListView1.Clear; nl:= xmldoc.documentElement.selectNodes('mov'); for i := 0 to nl.length - 1 do begin subNode := nl.item[i].selectSingleNode('id'); ListView1.Items.Add; ListView1.Items[i].Caption := subNode.text; with ListView1.Items[i].SubItems do begin subNode := nl.item[i].selectSingleNode('name'); if lowercase(subNode.text) = lowercase(LabeledEdit1.Text) then Add(subNode.text); end; end; ListView1.Items.EndUpdate; end; |
Re: suche in xml
Ich kann dir irgendwie nicht folgen, weil du auch ständig dein XML-Format änderst. Mal <tester_db>, jetzt wieder <mov_db>, dann nur noch <mov> ... :gruebel: :mrgreen:
Dein Problem mit der List-View lässt sich wie folgt lösen:
Delphi-Quellcode:
Spricht irgendwas gegen die Verwendung einer TListItem-Variablen? Ich meine, so viel größer wird sie dein Programm nicht machen. ;)
lvi := ListView1.Items.Add;
lvi.Caption := subNode.Text; lvi.SubItems.(blablabla); |
Re: suche in xml
entschuldige die verwirrung :D
wollte eigendlich nur einfachere beispiele verwenden ;) naja.. funzt ned.. ich lass es.. muss einen anderen weg finden thx für die hilfe.. echt cool die hilfe von dir mathias |
Re: suche in xml
Liste der Anhänge anzeigen (Anzahl: 1)
So schwer ist das aber gar nicht (s. Anhang).
Guck ob dir das irgendwie hilft. Preisfrage: Woher stammt der Name der Funktion, die für die Suche zuständig ist, und wie müsste der richtige Suchbegriff lauten? :mrgreen: |
Re: suche in xml
jo.. das ganze ist gut.. jedoch hab ich jetzt wieder den fehler, dass es mir nur extakte suchen ausgibt :D
daher verwendete ich zu begin contains |
Re: suche in xml
Also, bei meinem Beispiel ist es egal, ob du nach Thomas, thoMAS, ThOmAs o.ä. suchst. Es sollte alle entsprechenden Vorkommen von Thomas finden, egal wie sie in der XML-Datei oder im Beispielprogramm geschrieben werden.
|
Re: suche in xml
das schon.. aber sobald er 'Thomas Dahinden' heisst.. ist aus mit der freude :D
|
Re: suche in xml
Dann musst du
![]() |
Re: suche in xml
*schäm* :duck:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz