Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Von MSXML zu OmniXML kleines Problem aufgetreten (https://www.delphipraxis.net/22525-von-msxml-zu-omnixml-kleines-problem-aufgetreten.html)

Tillmet 18. Mai 2004 20:11


Von MSXML zu OmniXML kleines Problem aufgetreten
 
Hi
Also, ich rätsle hier schon sehr lange dran, doch wie ich euch kenne, findet ihr eine schnelle und einfache Lösung, auf die ich einfach mal wieder nicht gekommen bin :?: . Also, mein Problem ist, ich habe mit MS XML was gemacht, doch nun stellte sich herraus, dass auf dem Einsatzpc kein MS XML vorhanden ist und nicht installiert werden kann. Gut, dachte ich mir, dann suchste mal. Dabei ist OmniXML herausgekommen, die Lösung schien mir wunderbar, und es klappte wirklich, alle Befehle von MS XML umzuschreiben, war kein Problem, hatte ich hier http://www.delphipraxis.net/internal...hlight=omnixml gefunden und vorher habe ich Chakotay1308s Tutorial zum Thema XML mit MS XML gelesen, hatte das Programm damit ja auch schon fertig gestellt, es liest nur eine XML Datei ein, gibt es in einer Tabelle aus und man kann dann die einzelnen Einträge verändern.
Mein Problem ist nur der eine Schritt, bei dem das einfache umschreiben des Befehles zu einem Fehler führt. Hier mal der Code:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  id: String;
  node: IXMLNode;
begin
  id := Tabelle.Items[Tabelle.ItemIndex].Caption;
  node := XMLDoc.documentElement.selectSingleNode(id);
  node.selectSingleNode('daten') := ComboBox1.Text;
  XMLDoc.save(AppPath + 'database.xml');
  UpdateList;
end;
So, hier kommt an der Stelle
Delphi-Quellcode:
  node.selectSingleNode('daten') := ComboBox1.Text;
Ein Fehler, also tippe ich mal, dass irgendwas daran nicht stimmt, unter MS XML funzt es jedoch, das is das Problem.
Was könnte ich noch machen? Oder hat einer ein ganzes Tut zu OmniXML? Von www.omnixml.com

CalganX 18. Mai 2004 20:40

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Hi,
ein Tutorial kann ich dir nicht liefern, allerdings die Lösung:
Code:
node.selectSingleNode('daten')[color=#ff0000].text[/color] := ComboBox1.Text;
;)

Chris

Tillmet 18. Mai 2004 20:42

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Sorry, muss dich enttäuschen, funzt auch nicht, hatte auch nur vergessen, es oben in den Code zu schreiben, sry.
Wie könnte ich denn mal testen, ob es überhaupt an der Funktion liegt und nicht an der Tabelle, oder der ComboBox?

Edit:
Delphi-Quellcode:
  node.selectSingleNode('daten').text := 'Hallo';
Habe es so gemacht und funzt auch nicht.

CalganX 18. Mai 2004 21:06

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Hi,
prüfe mal, ob node überhaupt existiert (sprich <> nil ist). Ansonsten muss du gucken, ob deine XSL-Abfrage richtig ist.

Chris

MathiasSimmack 18. Mai 2004 21:16

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Zitat:

Zitat von Chakotay1308
Ansonsten muss du gucken, ob deine XSL-Abfrage richtig ist.

XSL? XPath, meinst du wohl? ;)

CalganX 18. Mai 2004 21:18

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Hi,
stimmt das meine ich. :oops:
Nachdem sakura einmal eine Variable sXSL genannt hat und dann damit XPath gemacht hat, komme ich ständig durcheinander. :mrgreen: *alles auf die katze schieb* ;)

Chris

Tillmet 18. Mai 2004 21:20

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Also, um es besser zu sehen, mal der ganze Code:



Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Tabelle: TListView;
    Edit1: TEdit;
    Button1: TButton;
    Edit2: TEdit;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    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);
  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
  id: String;
  node: IXMLNode;
begin
  id := Tabelle.Items[Tabelle.ItemIndex].Caption;
  node := XMLDoc.documentElement.selectSingleNode('prowo/daten'+id);
  if node = nil then showmessage('is da');
  node.selectSingleNode('daten').text := 'Hallo';
  XMLDoc.save(AppPath + 'database.xml');
  UpdateList;
end;

end.

MathiasSimmack 18. Mai 2004 21:43

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
1. Das hier
Zitat:

Delphi-Quellcode:
XMLDoc.DocumentElement := XMLDoc.CreateElement('daten');

ist relativ sinnlos, weil du danach den XML-Code sowieso aus der Datei holst, bzw. im Code erzeugst. ;)

2. Bist du sicher, dass dein Dokument so aufgebaut ist
Code:
<Daten>
  <prowo>
    <daten1>
      <!--
         1 als Beispiel, weil ich nicht weiß, was
         "id := Tabelle.Items[Tabelle.ItemIndex].Caption;"
         für eine ID zurückgibt
      -->
    </daten1>
  </prowo>
</Daten>
Zumindest sucht deine XPath-Anweisung nach diesem Knoten
Zitat:

Delphi-Quellcode:
node := XMLDoc.documentElement.selectSingleNode('prowo/daten'+id);

3. Das hier ist albern:
Zitat:

Delphi-Quellcode:
if node = nil then showmessage('is da');

Anders herum wird ein Schuh draus. Wenn "node" ungleich nil ist, dann ist der Knoten da. ;)

4. Ist nicht gesagt, dass der Knoten "daten" dann auch existiert
Zitat:

Delphi-Quellcode:
node.selectSingleNode('daten').text := 'Hallo';

Zur Sicherheit solltest du so vorgehen:
Delphi-Quellcode:
subnode := node.selectSingleNode('daten');

// Knoten existiert
if(subnode <> nil) then
  subnode.text := 'Hallo'
else
// Knoten existiert nicht, also: anlegen
begin
  subnode := XMLDoc.createElement('daten');
  if(subnode <> nil) then
  begin
    subnode.text := 'Hallo';
    node.appendChild(subnode);
  end;
end;
(Angabe ohne Gewähr, weil ich an MS-XML gedacht habe.)

Tillmet 18. Mai 2004 21:57

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
:cry: nix will klappen.
Mit MS XML geht es, genau wie du sagts, aber mit Omni will es einfach nicht, ich teste noch weiter, wenn ich was finde, sage ich es.

Edit: Also, ich würde ja gerne mit MSXML arbeiten, aber wie kann ich das auf eineml PC ohne MSXML nutzen?

MathiasSimmack 19. Mai 2004 07:39

Re: Von MSXML zu OmniXML kleines Problem aufgetreten
 
Zitat:

Zitat von Tillmet
Edit: Also, ich würde ja gerne mit MSXML arbeiten, aber wie kann ich das auf eineml PC ohne MSXML nutzen?

Gar nicht. Aber du könntest mal deinen bisherigen Quellcode hier anhängen, evtl. mit einer Beispiel-XML-Datei, damit man auch weiß, wie das Ding aufgebaut ist, was ausgelesen werden soll, usw. Dann könnte man sich das mal selbst anschauen.


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

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