AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Von MSXML zu OmniXML kleines Problem aufgetreten
Thema durchsuchen
Ansicht
Themen-Optionen

Von MSXML zu OmniXML kleines Problem aufgetreten

Ein Thema von Tillmet · begonnen am 18. Mai 2004 · letzter Beitrag vom 18. Jul 2004
Antwort Antwort
Seite 2 von 2     12   
Tillmet

Registriert seit: 3. Mär 2004
Ort: Sarstedt
23 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 19. Mai 2004, 18:06
Habe mal das Ganze angehängt, wenn du OmniXML hast, kannste es gerne nachtesten.
Angehängte Dateien
Dateityp: rar prowo2.rar (11,1 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#12

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 20. Mai 2004, 14:20
Ich denke, dass es nicht an dir oder deinem Programm liegt. Es sieht so aus, als wäre die XPath-Implementation in OmniXML noch nicht vollständig. Sie kann zwar Knoten finden
Code:
/daten/name
und auch Attribute
Code:
/daten/name/@testattribut
aber sie kann anscheinend bisher noch nicht mit Filtern umgehen. Und Filter sind eben genau die Bedingungen, die du in eckigen Klammern angibst
Code:
/daten[name="' + id + '"]
Du solltest dir darum im Moment mit einem Work-Around behelfen. Wenn du also nach dem Namen (sprich: der ersten Spalte der List-View) suchst, dann würde das bspw. so aussehen:
Delphi-Quellcode:
  node := nil;
  daten := XMLDoc.DocumentElement.SelectNodes('daten/name');
  for i := 0 to daten.Length - 1 do
    if({Tabelle.Selected.Caption =} id = daten.Item[i].Text) then
    begin
      node := daten.Item[i].GetParentNode;
      break;
    end;

  if(node <> nil) then
  begin
    ShowMessage(node.XML);
  end;
  Mit Zitat antworten Zitat
Tillmet

Registriert seit: 3. Mär 2004
Ort: Sarstedt
23 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 20. Mai 2004, 22:14
Gut, dein Work Around zeigt die Daten schonmal gut an, ein Schritt weiter also, aber wie soll ich denn dann bearbeiten, etc?
Habe von OmniXML echt keine Peilung, sry.

Edit: okok, Du bist ein Gott und ich ein Idiot, sry. Musste jetzt ja nur noch
  node.selectSingleNode('projekt1').text := ComboBox1.Text; machen, dann hatte ich ja die selectierte Node, vielen Dank, dann mache ich jetzt mal weiter, bis der nächste Punkt bei Omni kommt, den ich nicht kann ^^, vielen Dank.


Edit2: Ich hoffe, du liest das hier ^^. Also, wenn ich schon dabei bin zu fragen, dann mache ich gleich mal weiter. Wie könnte ich denn jetzt noch eine Suchfunktion einbauen? Ein Edit Feld, in das gibt man Klasse, oder Name ein und es wird dann gesucht? Geht das bei ListView? Wenn ja, wie? Oder haste gleich mal ein ListView Tutorial zur Hand?
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#14

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 21. Mai 2004, 07:16
Zitat von Tillmet:
Edit: okok, Du bist ein Gott [...]
Ich weiß. *fingernägelanhauchundamShirtabwisch*

Zitat:
[...] und ich ein Idiot, sry.
Ich w... *g* Ich meine, das kann ich nicht beurteilen.

Zitat:
Wie könnte ich denn jetzt noch eine Suchfunktion einbauen? Ein Edit Feld, in das gibt man Klasse, oder Name ein und es wird dann gesucht? Geht das bei ListView?
Ja, das müsstest du aber IMHO selbst programmieren. Die Subitems lassen sich relativ einfach durchsuchen, da es sich ja um eine Stringliste handelt, die "IndexOf" kennt (s. Hilfe). Aber du müsstest meiner Meinung nach in einer Schleife durch die Einträge der List-View durch und dann eben schauen ob du was findest. Du solltest evtl. berücksichtigen, dass es identische Einträge gibt. (Gut, das weiß ich nicht, aber möglich ist IMHO ja alles ... ) In dem Fall wäre es vielleicht ganz gut, eine Art Auswahl zu gestatten, indem du die identischen Einträge noch mal auflistest. Vergleichbar mit dem Index von Hilfedateien.
  Mit Zitat antworten Zitat
Tillmet

Registriert seit: 3. Mär 2004
Ort: Sarstedt
23 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 21. Mai 2004, 10:45
Hi
Danke nochmal, klappt soweit alles, nur mein Ansatz für das Durchsuchen scheitert immer. Ich habe mir gedacht, ich verbinde einfach deinen Vorschlag für das Suchen der einzelnen Datensätze und den alten Code, von der Theorie klappt es auch, und praktisch auch zu ca. 50% Doch, 2 Probleme bleiben offen, guck es dir an:

Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var
  daten: IXMLNodeList;
  i,j: integer;
  subNode: IXMLNode;
  node: IXMLNode;
begin
  j := 0;
  Tabelle.Items.Clear;
  Tabelle.Items.BeginUpdate;
  daten := XMLDoc.documentElement.selectNodes('daten/name');
  for i:=0 to daten.length -1 do begin
  if(Edit1.Text = daten.Item[i].Text) then
    begin
    subNode := daten.item[i].ParentNode('name');
    Tabelle.Items.Add;
    Tabelle.Items[j].Caption := subNode.Text;
    with Tabelle.Items[j].SubItems do begin
        subNode := daten.item[i].selectSingleNode('klasse');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt1');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt2');
        if subNode <> nil then
          Add(subNode.Text);
        j := j+1;
      end;
    end;
      break;
    end;

  Tabelle.Items.EndUpdate;
end;
Das Problem ist, wenn ich bei     Tabelle.Items[j].Caption := subNode.Text; Jetzt := 'Hallo' machen würde, würde es gehen, doch so geht's leider nicht, denn in der subNode wird nichts aufgenommen, da ich am Anfang ja leider   daten := XMLDoc.documentElement.selectNodes('daten/name'); machen muss, sonst würde es bis dahin wieder nicht funktionieren. Doch er findet jetzt ja keine Node mit Namen, da die schon geladen is, oder irgendwie was in der Richtung, das ist auf jeden Fall Fehler 1, den ich gerade versuche zu beheben.
Fehler 2 wäre dann, dass ich gerne hätte, dass man auch nur "Na" in das Edit Feld eingeben kann und dann schon alle Daten, die "Na" drin haben angezeigt werden, und je mehr man vom Namen eingibt, desto mehr beschränkt sich die Auswahl.
Ach und eine kleine Frage am Rande, was heißt IMHO???

Edit:
Ok, das eine hätte ich ja behoben, wenn ich statt subNode := daten.item[i].ParentNode('name');     subNode := daten.item[i]; machen würde, aber dann besteht das Prob ja weiterhin, da ich dann nicht auf Klasse etc. zugreifen kann, da ich schon zu tief in den Nodes drin bin.


Edit2:
Ok, nächsten Fehler behoben:
Delphi-Quellcode:
procedure TForm1.Edit1Change(Sender: TObject);
var
  daten, daten2: IXMLNodeList;
  i, mu: integer;
  subNode: IXMLNode;
begin
  Tabelle.Items.Clear;
  Tabelle.Items.BeginUpdate;
  daten := XMLDoc.documentElement.selectNodes('daten');
  for i:=0 to daten.Length do begin
  mu := Pos (Edit1.Text, daten.Item[i].Text);
  if(mu <> 0) then
    begin
    daten2 := XMLDoc.DocumentElement.SelectNodes('daten');
    subNode := daten.item[i].SelectSingleNode('name');
    Tabelle.Items.Add;
    Tabelle.Items[i].Caption := subNode.Text;
    with Tabelle.Items[i].SubItems do begin
        subNode := daten.item[i].SelectSingleNode('klasse');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt1');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt2');
        if subNode <> nil then
          Add(subNode.Text);
      end;
    end;
      break;
    end;

  Tabelle.Items.EndUpdate;
end;
Frag mich nicht wie, aber es geht soweit. Das Problem ist nun folgendes, es wird immer höchstens nur ein Datensatz angezeigt, also muss irgendwas an der Schleife falsch sein.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#16

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 21. Mai 2004, 11:45
Ich verstehe wohl heute nur die Hälfte (oder noch weniger) von dem was du schreibst. Du erzählst was von einer Suche in der List-View. Warum greifst du dann aber auf die XML-Datei zu? Ich meine, sämtliche Angaben stehen doch schon in der LV.
Du brauchst doch also nur eine Schleife, die durch alle Items in der LV durchgeht und dort nach dem gewünschten Begriff sucht - sowohl in der "Caption" als auch in den SubItems. Bei letzteren kannst du "IndexOf" benutzen.

Und hier
Delphi-Quellcode:
        if subNode <> nil then
          Add(subNode.Text);
solltest du auch berücksichtigen, dass ein Knoten mal leer sein kann, bzw. gar nicht gefunden wird. Das hast du zwar durch die Prüfung auf nil, aber wenn der Knoten eben mal nil ist, dann werden keine SubItems in die LV eingefügt.
Wenn du dann irgendwo im Code versuchst, auf das x. SubItem zuzugreifen, wäre ein unschöner Fehler die Folge. Mach´s also besser so:
Delphi-Quellcode:
        if subNode <> nil then
          Add(subNode.Text)
        else
          Add('');
Zitat:
Ach und eine kleine Frage am Rande, was heißt IMHO???
Was hast du denn für einen Browser? Bei mir wird der Begriff grün unterstrichelt, und wenn man die Maus drauf hält, dann bekommt man die Erklärung.
  Mit Zitat antworten Zitat
Tillmet

Registriert seit: 3. Mär 2004
Ort: Sarstedt
23 Beiträge
 
Delphi 7 Enterprise
 
#17

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 21. Mai 2004, 11:56
Okok, hast wie immer völlig Recht, wozu denn XML ^^, ich kanns doch einfach in der ListView Ordnen lassen, nur weiß ich noch nicht genau, wie ich die Schleife machen soll, doch das mache ich jetzt mal.
Ach und zu meinem Browser, ich habe IE 6.0, aber dank meinem XP Style funzt das mit dem grünen leider nicht, früher hats das mal ^^.

Edit:
Also, könntest du mir sagen, was es heißt ^^?
Und könntest du mich noch ein Stück näher an meine Antwort mit der Schleife heranführen?

Edit2:
Um es nochmal ganz genau zu sagen, Ich habe jetzt die XML Datei in der ListView, ok. Man kann es auch durch Klicken auf die Columns auf und absteigend ordnen, und auch das Verändern, des Projektes, durch die ComboBox funzt wunderbar. Jetzt würde ich aber gerne noch, damit man nicht immer so viel scrollen muss, ein Edit Feld einbauen, und wenn man dort z.B. was eingibt, wie "Til" sollte die ListView sich bei jedem eingegebenen Buchstaben (halt OnChange) verändern, und zwar sollte sie dann nur die Namen anzeigen, die mit "Til" anfangen, oder es beinhalten, damit ich dann da einfacher das Projekt verändern kann. Und da habe ich keine Peilung wie, denn ich habe noch nie mit ListView, und XML gearbeitet, und sowieso bin ich nicht so ein toller Coder...sry
  Mit Zitat antworten Zitat
Tillmet

Registriert seit: 3. Mär 2004
Ort: Sarstedt
23 Beiträge
 
Delphi 7 Enterprise
 
#18

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 22. Mai 2004, 12:56
Also, ich schließe das mal als erledigt ab, denn mein XML Problem ist ja gelöst, der Rest hat jetzt mit anderen Komponenten zu tun, und nochmals vielen Dank.

Ich habe es übrigens so hinbekommen, wie ich es ca. wollte, ich muss nur noch an der Suchfunktion pfeilen, damit er auch nach Teilen in dem String sucht, und nicht nur, wenn man das ganze Wort eingegeben hat.
Hier mal der neue Code, is eigentlich ganz einfach gewesen, wirste sehen:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OmniXML, ComCtrls, StdCtrls, StrUtils, Menus;

type
  TForm1 = class(TForm)
    Tabelle: TListView;
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Button2: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure UpdateList;
    procedure TabelleColumnClick(Sender: TObject; Column: TListColumn);
    procedure TabelleCompare(Sender: TObject; Item1, Item2: TListItem;
      Data: Integer; var Compare: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Edit1Change(Sender: TObject);
    procedure Edit2Change(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  XMLDoc: IXMLDocument;
  AppPath: string;
  ColumnToSort: Integer;
  LastSorted: Integer;
  SortDir: Integer;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  AppPath := ExtractFilePath(Application.ExeName);
  XMLDoc := CreateXMLDoc;
  XMLDoc.DocumentElement := XMLDoc.CreateElement('daten');
  if not FileExists(AppPath+'database.xml') then begin
    XMLDoc.loadXML('<?xml version="1.0" encoding="ISO-8859-1"?><Daten></Daten>');
  end else
    XMLDoc.load(AppPath+'database.xml');
  if XMLDoc.parseError.errorCode <> 0 then begin
    MessageDlg('Die XML Datei ist nicht korrekt!' + #13#10
    + 'Das Programm wird nun beendet!', mtError, [mbOK], 0);
    Application.Terminate;
  end;
  UpdateList;
end;



procedure TForm1.UpdateList;
var
  daten: IXMLNodeList;
  subNode: IXMLNode;
  i: integer;
begin

Tabelle.Items.Clear;
  Tabelle.Items.BeginUpdate;
  daten := XMLDoc.documentElement.selectNodes('daten');
  for i:=0 to daten.length -1 do begin
    subNode := daten.item[i].selectSingleNode('name');
    Tabelle.Items.Add;
    Tabelle.Items[i].Caption := subNode.Text;
    with Tabelle.Items[i].SubItems do begin
        subNode := daten.item[i].selectSingleNode('klasse');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt1');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt2');
        if subNode <> nil then
          Add(subNode.Text);
      end;
    end;
  Tabelle.Items.EndUpdate;
end;



procedure TForm1.TabelleColumnClick(Sender: TObject; Column: TListColumn);
begin
  ColumnToSort := Column.Index;
  if ColumnToSort = LastSorted then
    SortDir := 1 - SortDir
  else
    SortDir := 0;
  LastSorted := ColumnToSort;
  (Sender as TCustomListView).AlphaSort;
end;

procedure TForm1.TabelleCompare(Sender: TObject; Item1, Item2: TListItem;
  Data: Integer; var Compare: Integer);
var
  ix: Integer;
begin
  if ColumnToSort = 0 then
  begin
    if SortDir = 0 then
      Compare := CompareText(Item1.Caption,Item2.Caption)
    else
      Compare := CompareText(Item2.Caption,Item1.Caption);
  end //if ColumnToSort = 0 then
  else
  begin
   ix := ColumnToSort - 1;
   if SortDir = 0 then
     Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix])
   else
     Compare := CompareText(Item2.SubItems[ix],Item1.SubItems[ix]);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  node: IXMLNode;
  daten: IXMLNodeList;
  i: integer;
begin
  node := nil;
  daten := XMLDoc.DocumentElement.SelectNodes('daten/name');
  for i := 0 to daten.Length - 1 do
    if(Tabelle.Selected.Caption = daten.Item[i].Text) then
    begin
      node := daten.Item[i].GetParentNode;
      break;
    end;

  if(node <> nil) then
  begin
    ShowMessage(node.XML);
    node.selectSingleNode('projekt1').text := ComboBox1.Text;
    UpdateList;
  end;
end;


procedure TForm1.Edit1Change(Sender: TObject);
var
  daten: IXMLNodeList;
  subNode: IXMLNode;
  i, j: integer;
begin
j := 0;
Tabelle.Items.Clear;
  Tabelle.Items.BeginUpdate;
  daten := XMLDoc.documentElement.selectNodes('daten');
  for i:=0 to daten.length -1 do begin
    subNode := daten.item[i].selectSingleNode('name');
    If (SoundEx(subNode.Text,2) = SoundEx(Edit1.Text,2)) then
    begin
    Tabelle.Items.Add;
    Tabelle.Items[j].Caption := subNode.Text;
    with Tabelle.Items[j].SubItems do begin
        subNode := daten.item[i].selectSingleNode('klasse');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt1');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt2');
        if subNode <> nil then
          Add(subNode.Text);
      end;
      j := j+1;
    end;
    end;
  Tabelle.Items.EndUpdate;
end;

procedure TForm1.Edit2Change(Sender: TObject);
var
  daten: IXMLNodeList;
  subNode: IXMLNode;
  i, j: integer;
begin
j := 0;
Tabelle.Items.Clear;
  Tabelle.Items.BeginUpdate;
  daten := XMLDoc.documentElement.selectNodes('daten');
  for i:=0 to daten.length -1 do begin
    subNode := daten.item[i].selectSingleNode('name');
    If (subNode.Text = Edit2.Text) then
    begin
    Tabelle.Items.Add;
    Tabelle.Items[j].Caption := subNode.Text;
    with Tabelle.Items[j].SubItems do begin
        subNode := daten.item[i].selectSingleNode('klasse');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt1');
        if subNode <> nil then
          Add(subNode.Text);
        subNode := daten.item[i].selectSingleNode('projekt2');
        if subNode <> nil then
          Add(subNode.Text);
      end;
      j := j+1;
    end;
    end;
  Tabelle.Items.EndUpdate;

end;

end.
Wie gesagt, einfach nur noch eine If Abfrage dazwischen, bei OnChange, jetzt wird es wunderbar angezeigt.

Edit:
So, alles geht soweit, habe auch die Suchfunktion mit einer netten Funktion, die ich hier im Forum gefunden habe verbessert, alles wunderbar soweit, jetzt muss ich noch das Speichern einbauen, damit man das dann auch als txt oder doc, oder sonstwas hat.
  Mit Zitat antworten Zitat
aps

Registriert seit: 21. Sep 2003
Ort: Hameln
62 Beiträge
 
Delphi 6 Professional
 
#19

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Jul 2004, 09:37
Zitat von Tillmet:
    XMLDoc.loadXML('<?xml version="1.0" encoding="ISO-8859-1"?><Daten></Daten>');
Frage: Funktioniert das bei dir? Mit MS-XML klappte das auch bei mir, aber OmniXML wirft immer eine Exception "ungültiges Zeichen im Tag" aus. Ich nehme an, wegen des ? als erstes Zeichen im Tag.
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:59 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