Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi suche in xml (https://www.delphipraxis.net/42701-suche-xml.html)

mav 22. Mär 2005 18:42


suche in xml
 
hi all

ich durchsuche meine .xml mithilfe von

Delphi-Quellcode:
nl:= xmldoc.selectNodes('/*/*[contains(name,"'+LabeledEdit1.Text+'")]');
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

mr47 22. Mär 2005 19:04

Re: suche in xml
 
Du kannst mit lowercase alle Buchstaben in kleinbuchstaben umwandeln. (oder anders mit upperCase alles in groß)

Delphi-Quellcode:
lowercase(Suchbegriff)=lowerCase(Xml-eintrag)
mfg


edit: Delphi-Referenz durchsuchenlowercase :wink:

mav 22. Mär 2005 19:11

Re: suche in xml
 
delphi sagt mir aber, dass uppercase und lowercase nicht xmldoc komp. sind

habe ich auch schon probiert

mr47 22. Mär 2005 20:09

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 Delphi-Referenz durchsuchenupperCase vergleichst???


mfg

mav 22. Mär 2005 21:51

Re: suche in xml
 
habe das ganze jetzt mal so versucht

Delphi-Quellcode:
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
jedoch gibt er mir immer noch nichts heraus, wenn ich "thomas" klein schreibe

[edit]
weitere infos zugunsten von bttb

Delphi-Quellcode:
xmlDoc: IXMLDOMDocument2
statt /*/* könnte ich auch /<datenbank>/<eintraege> schreiben

bttb930 22. Mär 2005 22:05

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.

MathiasSimmack 22. Mär 2005 23:19

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.

czapie 22. Mär 2005 23:22

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.

MathiasSimmack 23. Mär 2005 09:45

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:
/*/*[contains([b]name[/b],"'+LabeledEdit1.Text+'")]
doch nicht auf den Inhalt sondern auf den Namen des Knotens selbst bezieht. Aber dann müsste deine XML-Datei ja so aussehen:
XML-Code:
<datenbank>
  <Thomas>
   
  </Thomas>
</datenbank>
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.

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:
<datenbank>
  <person>
    <name>Thomas Maier</name>
  </person>
  <person>
    <name>Thomas Müller</name>
  </person>
</datenbank>
und du willst jetzt in einer Art Suchfunktion alle Namen anzeigen lassen, in denen Thomas vorkommt. Dann kannst du erst mal mit
Code:
/datenbank/person/name
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 Delphi-Referenz durchsuchenlowercase oder Delphi-Referenz durchsuchenuppercase und/oder Delphi-Referenz durchsuchenpos verwenden. Und wenn der Name Thomas dann gefunden wurde, gibst du den Parent-Knoten an eine Funktion deines Programms weiter, die für die Auflistung des Namens und der Daten sorgt, o.ä.

Das ist IMHO einfacher, als ein XML-Format zu nutzen, bei dem man die Namen von Personen als Knotennamen benutzt.

mav 23. Mär 2005 14:33

Re: suche in xml
 
also meine .xml ist so aufgebaut

Delphi-Quellcode:
<tester_db><tester><name>Thomas</name></tester></tester_db>

MathiasSimmack 23. Mär 2005 15:11

Re: suche in xml
 
Aha. Na ja, dann mach´s wie ich vorgeschlagen habe:
Code:
/tester_db/tester/name
mit "selectNodes", und du hast alle (wenn es mehrere sind) Namen in IXMLDOMNodeList. Den Rest machst du wie vorgeschlagen in einer Schleife.

mav 23. Mär 2005 16:12

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);

MathiasSimmack 23. Mär 2005 16:31

Re: suche in xml
 
Zitat:

funktioniert noch nicht so ganz
ist immer eine super Fehlerbeschreibung, insbesondere dann, wenn man nicht sagt, was man eigentlich erreichen will. :mrgreen: Ausgehend von deinem Code müsste die Datei so aussehen:
XML-Code:
<tester_db>
  <tester>
    <name>
      Thomas
      <name>?</name>
      <id>?</id>
    </name>
  </tester>
</tester_db>
Tut sie aber bestimmt nicht. Bitte beachte, dass du dich mit der XPath-Anweisung
Code:
/tester_db/tester/name
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. ;)

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:

Delphi-Quellcode:
if lowercase(nl.item[i].nodeValue) = lowercase(LabeledEdit1.Text) then

  subNode := nl.item[i].selectSingleNode('id');

Oder? :)

mav 23. Mär 2005 17:16

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:
if lowercase(nl.item[i].nodeValue) = lowercase(LabeledEdit1.Text) then begin
das ganze sieht jetzt so aus...

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;

MathiasSimmack 23. Mär 2005 19:27

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 MSDN-Library durchsuchenIXMLDOMNode an. Und versuch dein Glück stattdessen mal mit text bzw. Get_text.

Und, äh, ...
Delphi-Quellcode:
ListView1.Items.BeginUpdate;
ListView1.Clear;
solltest du nicht in der Schleife drin haben.

mav 24. Mär 2005 11:25

Re: suche in xml
 
so.. nach langem hin und her hab ich jetzt mal dieses hier versucht..

Delphi-Quellcode:
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;
jedoch überschreited jetzt der listenindex max.(5) und ich finde den fehler nicht :(

MathiasSimmack 24. Mär 2005 11:37

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:
lvi := ListView1.Items.Add;
lvi.Caption := subNode.Text;
lvi.SubItems.(blablabla);
Spricht irgendwas gegen die Verwendung einer TListItem-Variablen? Ich meine, so viel größer wird sie dein Programm nicht machen. ;)

mav 24. Mär 2005 13:24

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

MathiasSimmack 24. Mär 2005 14:29

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:

mav 29. Mär 2005 00:48

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

MathiasSimmack 29. Mär 2005 13:29

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.

mav 29. Mär 2005 18:46

Re: suche in xml
 
das schon.. aber sobald er 'Thomas Dahinden' heisst.. ist aus mit der freude :D

MathiasSimmack 29. Mär 2005 19:09

Re: suche in xml
 
Dann musst du Delphi-Referenz durchsuchenPos benutzen, bzw. eine bessere Funktion, die vllt. auch "Thomas *" als passend erkennt. Und beim nächsten Mal bitte sagen, dass du Vor- und Zunamen suchen willst. :roll:

mav 29. Mär 2005 22:43

Re: suche in xml
 
*schäm* :duck:


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz