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 1 von 2  1 2      
Tillmet

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

Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 21:11
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
  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
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 21:40
Hi,
ein Tutorial kann ich dir nicht liefern, allerdings die Lösung:
Code:
node.selectSingleNode('daten')[color=#ff0000].text[/color] := ComboBox1.Text;


Chris
  Mit Zitat antworten Zitat
Tillmet

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

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 21:42
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:
  node.selectSingleNode('daten').text := 'Hallo'; Habe es so gemacht und funzt auch nicht.
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 22:06
Hi,
prüfe mal, ob node überhaupt existiert (sprich <> nil ist). Ansonsten muss du gucken, ob deine XSL-Abfrage richtig ist.

Chris
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 22:16
Zitat von Chakotay1308:
Ansonsten muss du gucken, ob deine XSL-Abfrage richtig ist.
XSL? XPath, meinst du wohl?
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 22:18
Hi,
stimmt das meine ich.
Nachdem sakura einmal eine Variable sXSL genannt hat und dann damit XPath gemacht hat, komme ich ständig durcheinander. *alles auf die katze schieb*

Chris
  Mit Zitat antworten Zitat
Tillmet

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

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 22:20
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.
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#8

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 22:43
1. Das hier
Zitat:
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:
node := XMLDoc.documentElement.selectSingleNode('prowo/daten'+id);
3. Das hier ist albern:
Zitat:
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:
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.)
  Mit Zitat antworten Zitat
Tillmet

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

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 18. Mai 2004, 22:57
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?
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#10

Re: Von MSXML zu OmniXML kleines Problem aufgetreten

  Alt 19. Mai 2004, 08:39
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 21:30 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