Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr.
Seite 2 von 3     12 3      

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