Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Problem mit XML Turtoial von Chack (https://www.delphipraxis.net/19464-problem-mit-xml-turtoial-von-chack.html)

citybreaker 3. Apr 2004 20:02


Problem mit XML Turtoial von Chack
 
So hier der 3. Thread zu dem Tutorial.
Ich meine XML Datei folgendermaßen aufgebaut.

movies.xml
<?xml version="1.0" encoding="ISO-8895-1"?>
<movieorganiezer>
<movie>
<id>1</id>
<name>Der Schuh des Manitu</name>
<format>DVD</format>
<ton>DD5.1</ton>
</movie>
</movieorganiezer>

Und dann noch folgende Source.
Delphi-Quellcode:
unit main;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ComCtrls, Menus, msxml2_tlb;

type
  TMainFrm = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    Beenden1: TMenuItem;
    Film1: TMenuItem;
    Hinzufgen1: TMenuItem;
    Entfernen1: TMenuItem;
    N1: TMenuItem;
    Bearbeiten1: TMenuItem;
    N2: TMenuItem;
    Info1: TMenuItem;
    StatusBar1: TStatusBar;
    MovieList: TListView;
    procedure FormCreate(Sender: TObject);
    procedure UpdateList;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    fAppPath: string;
  end;

const
  DATABASE_FNAME ='movies.xml';
var
  MainFrm: TMainFrm;
  xmlDoc: IXMLDOMDocument2;

implementation

{$R *.DFM}

procedure TMainFrm.FormCreate(Sender: TObject);
begin
  fAppPath := ExtractFilePath(Application.Exename);
  XmlDoc := CoDomDocument40.Create;
  XmlDoc.SetProperty('NewParser', true);
  if not FileExists(fAppPath + DATABASE_FNAME) then begin
    XmlDoc.loadXml('<?xml version="1.0"?><movieorganiezer></movieorganiezer>');
  end else
    XmlDoc.load(fAppPath + DATABASE_FNAME);
  if XmlDoc.parseError.errorCode <> 0 then begin
    MessageDlg('Die XML Datei ist nicht korrekt!' + #13#10
              +'Das Programm wird nun beenden!', mtError, [MbOk], 0);
    Application.Terminate;
  end;
  if XmlDoc.documentElement.nodeName <> 'movieorganiezer' then
    Application.Terminate;
end;

procedure TMainFrm.UpdateList;
const
  NAMES: array[0..2] of string = ('name', 'format', 'ton');
var
  movies: IXMLDOMNodeList;
  subNode: IXMLDOMNode;
  i, j: integer;
begin
  MovieList.Items.Clear;
  MovieList.Items.BeginUpdate;

  movies := xmlDoc.documentElement.selectNodes('movie');
  for i:=0 to movies.length - 1 do begin
    subNode := movies.item[i].selectSingleNode('id');
    MovieList.Items.Add;
    MovieList.Items[i].Caption := subnode.text;
      with Movielist.Items[i].SubItems do begin
          for j:=0 to length(NAMES[-1]) do begin
            subNode := movies.item[i].selectSingleNode(Names[j]);
            if subNode <> nil then
              Add(subNode.text)
            else
              Add('');
            end;
        end;
    end;
  MovieList.items.endupdate;
end;
end.
Jetzt kommt beim Start immer die Fehlermeldung mit "nicht korrekter Xml Datei"
Woran liegt das? Hab die Datei im selben Ordner wie die Exe.

Mirilin 3. Apr 2004 20:17

Re: Problem mit XML Turtoial von Chack
 
:hi:

Keine Ahnug, aber bei mir hat er beim ISO-Typ gemeckert.

Code:
<?xml version="1.0" encoding="ISO-8859-1" ?>
so hat IE nicht mehr gemeckert.


mfg Tobias

MathiasSimmack 3. Apr 2004 20:29

Re: Problem mit XML Turtoial von Chack
 
@Mirilin: Das Leerzeichen spielt keine Rolle. Ich habe selbst auch eine Datei, die verkürzt so aussieht:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet href="archiv.xsl" type="text/xsl"?>
<!DOCTYPE archiv SYSTEM "archiv.dtd">
<archiv sig="2004" shortname="2004-04" name="April">
  <day name="3. April 2004">...</day>
</archiv>
und da stört sich der IE auch nicht dran. Das Problem liegt anderswo. Wobei ich natürlich sagen muss, dass ich die selbe Fehlermeldung bekam. Da aber, wie gesagt, eine meiner Dateien die gleiche Kodierung hat, kann´s nicht am Leerzeichen liegen.

@citybreaker: Kleiner Tipp für bessere Fehlermeldungen. Ändere mal deine Infobox wie folgt ab:
Delphi-Quellcode:
    MessageDlg(Format('Fehler %s in Zeile %d, Position %d:' + #13#10 +
      '%s',[xmldoc.parseError.reason,xmldoc.parseError.line,
      xmldoc.parseError.linepos,xmldoc.parseError.srcText]),
      mtError,[mbok],0);
dann siehst du was los ist. ;)

Mirilin 3. Apr 2004 20:31

Re: Problem mit XML Turtoial von Chack
 
:hi:

@Mathias
Bei mir waren es nicht Leerzeichen sonder die 5 und die 9 die an verschienden Plätzen lagen.


ISO-8859-1 vs ISO-8895-1

mfg Tobias

MathiasSimmack 3. Apr 2004 20:41

Re: Problem mit XML Turtoial von Chack
 
Hey, du hast recht. Ich sollte vielleicht mal meine Augen aufmachen. Wird hiermit getan: :shock:
Entschuldige, ich nehme alles zurück. ;)

MathiasSimmack 3. Apr 2004 20:43

Re: Problem mit XML Turtoial von Chack
 
Übrigens:
Zitat:

Zitat von citybreaker
<movieorganiezer>

Gesundheit. :mrgreen:

citybreaker 4. Apr 2004 09:25

Re: Problem mit XML Turtoial von Chack
 
Zitat:

Zitat von Mirilin
:hi:

@Mathias
Bei mir waren es nicht Leerzeichen sonder die 5 und die 9 die an verschienden Plätzen lagen.


ISO-8859-1 vs ISO-8895-1

mfg Tobias

Jetzt klappt es. Danke! Hab mich wohl böse verschrieben. :coder:
Nun gib es noch das Problem das igendwie nix geladen wird was in der XML Datei steht.
Code zum laden steht oben.

CalganX 4. Apr 2004 10:51

Re: Problem mit XML Turtoial von Chack
 
Hi,
hast du denn überhaupt fAppPath einen Wert zugewiesen? Das müsste eigentlich das Verzeichnis der Anwendung sein...

Chris

citybreaker 4. Apr 2004 11:04

Re: Problem mit XML Turtoial von Chack
 
Joa, hab ich gemacht.

Delphi-Quellcode:
procedure TMainFrm.FormCreate(Sender: TObject);
begin
  fAppPath := ExtractFilePath(Application.Exename);
  ...
end;

CalganX 4. Apr 2004 11:30

Re: Problem mit XML Turtoial von Chack
 
Hi,
stimmt... :wall:
Aber hast du denn irgendwo UpdateList aufgerufen? Ich find in deinem Quelltext nix davon. ;)

Chris

citybreaker 4. Apr 2004 11:55

Re: Problem mit XML Turtoial von Chack
 
Ups, so hab ich jetzt ganz unten in der OnFormCreate.
Nun kommt beim Programmstart die Fehlermeldung:
"Der Index der Liste überschreitet das Maximum (-1)"

CalganX 4. Apr 2004 12:20

Re: Problem mit XML Turtoial von Chack
 
Hi,
geh mal bitte den SourceCode Zeile für Zeile durch und sag mir bitte wo der Fehler kommt. ;)

Chris

citybreaker 4. Apr 2004 12:22

Re: Problem mit XML Turtoial von Chack
 
Hier kommt er.
Delphi-Quellcode:
for j:=0 to length(NAMES[-1]) do begin

CalganX 4. Apr 2004 12:24

Re: Problem mit XML Turtoial von Chack
 
Hi,
ähm... mal eine Frage: woher kommt das [-1]? :shock: Das steht hoffentlich nicht in der PDF-File drin... :gruebel: Nimm das einfach mal raus.

Chris

MathiasSimmack 4. Apr 2004 12:28

Re: Problem mit XML Turtoial von Chack
 
Das liegt an dem "with" und dem Array "NAMES", weil "Names" auch eine Methode von TStrings ist. Entweder verzichtest du auf das "with", oder du benennst das Array um.

citybreaker 4. Apr 2004 12:32

Re: Problem mit XML Turtoial von Chack
 
So hab den Array nun auf "eintraege" geändert und die source auf
Delphi-Quellcode:
for j:=0 to length(eintraege)-1 do begin
.
Jetzt lässt sich das ganze nicht mehr Compilieren die oben angegebene Zeile
wird makiert und es folgendes angezeigt: "Inkompatible Typen: 'string' und 'array'."

MathiasSimmack 4. Apr 2004 12:47

Re: Problem mit XML Turtoial von Chack
 
Nimm´s mir nicht übel, aber du hast einen saumäßigen Code hingeschmiert. Lösch bspw. mal den "id"-Knoten aus deiner XML-Datei und probier´s noch mal. :roll:

Hier eine Variante, die funktioniert:
Delphi-Quellcode:
procedure TForm1.UpdateList;
const
  NAMES   : array[0..2]of string = ('name','format','ton');
var
  movies  : IXMLDOMNodeList;
  subNode : IXMLDOMNode;
  i,
  j       : integer;
  li      : TListItem;
begin
  if(xmldoc = nil) then exit;

  MovieList.Items.Clear;
  MovieList.Items.BeginUpdate;

  movies := xmldoc.selectNodes('//movie');
  for i := 0 to movies.length - 1 do
  begin
    subnode := movies.item[i].selectSingleNode('id');

    li     := MovieList.Items.Add;
    if(subnode <> nil) then li.Caption := subnode.text
      else li.Caption := '?';

    for j  := 0 to length(NAMES) - 1 do
    begin
      subnode := movies.item[i].selectSingleNode(NAMES[j]);
      if(subnode <> nil) then li.SubItems.Add(subnode.text)
        else li.SubItems.Add('unbekannt');
    end;
  end;

  MovieList.Items.EndUpdate;
end;
Neben einem genauen Blick ins Tutorial von Chakotay empfehle ich auch ein paar Grundlagen. Das wäre bei deiner Ratlosigkeit zur Fehlermeldung
Zitat:

"Inkompatible Typen: 'string' und 'array'."
sicher nicht verkehrt.


@Chakotay: Wie isses? Woll´n wir dein Tutorial noch zum Thema Doctypes und XSL ergänzen? :mrgreen:

citybreaker 4. Apr 2004 12:53

Re: Problem mit XML Turtoial von Chack
 
Ähm, ne klappt nicht. Ich glaube es liegt mal wieder an D3. >.<

MathiasSimmack 4. Apr 2004 12:55

Re: Problem mit XML Turtoial von Chack
 
Hm, mit
Zitat:

Ähm, ne klappt nicht.
kann ich nicht viel anfangen. Was klappt nicht?

citybreaker 4. Apr 2004 12:58

Re: Problem mit XML Turtoial von Chack
 
Das selbe wie vorher.

Zitat:

Delphi-Quellcode:
for j:=0 to length(eintraege)-1 do begin
Jetzt lässt sich das ganze nicht mehr Compilieren die oben angegebene Zeile
wird makiert und es folgendes angezeigt: "Inkompatible Typen: 'string' und 'array'."

CalganX 4. Apr 2004 13:06

Re: Problem mit XML Turtoial von Chack
 
Hi,
Moment... irgendwas ist jetzt schon wieder falsch. :( Poste nochmal den ganzen Source.

@Mathias: erweitern? :shock: Ich habe eine gute Beschäftigung, was ich im Urlaub mache: XML-Tutorial neuschreiben. :mrgreen: Naja, irgendwie scheint das anzuliegen, soviele Probleme, wie es gibt wrd das wohl überarbeitungsbedürftig sein.

Chris

MathiasSimmack 4. Apr 2004 13:12

Re: Problem mit XML Turtoial von Chack
 
Zitat:

Zitat von citybreaker
Das selbe wie vorher.

Tja, dafür kann ich nichts. Meine gepostete (!) Prozedur ist funktionstüchtig. Wenn du da was von
Zitat:

Delphi-Quellcode:
for j:=0 to length(eintraege)-1 do begin

drin stehen hast, dann handelt es sich nicht um meine Version.

citybreaker 4. Apr 2004 13:14

Re: Problem mit XML Turtoial von Chack
 
So hab deine Version übernommen. Es wird "for j := 0 to length(NAMES) - 1 do"
makiert und es kommt die selbe meldung wie vorher.

citybreaker 23. Apr 2004 12:14

Re: Problem mit XML Turtoial von Chack
 
Hmpf es klappt immer noch nicht.

MathiasSimmack 23. Apr 2004 13:29

Re: Problem mit XML Turtoial von Chack
 
Es tut mir leid, aber ich weiß keine andere Lösung mehr.
Ich habe dir gezeigt, was ich gemacht habe um das Problem zu lösen, und bei mir geht es.

Ich glaube aber nicht, dass ich irgendwelche Sonderversionen von D5 und D7 habe.
Kleines Rätsel am Rande -

Ich habe heute den Quellcode eines Programms zur Ansicht bekommen, das ebenfalls mit MS-XML 4 arbeitet. Ich hab´s mit D7 kompiliert und erhielt eine Zugriffsverletzung, weil das XML-Objekt nil war. Eine Erklärung habe ich nicht, denn der Code unterscheidet sich durch nichts von dem, den ich in solchen Fällen benutze.
Nur, dass eins meiner XML4-Programme diese Zicken nicht gemacht hat.

:gruebel:

citybreaker 23. Apr 2004 14:00

Re: Problem mit XML Turtoial von Chack
 
[quote]
Ich glaube aber nicht, dass ich irgendwelche Sonderversionen von D5 und D7 habe.
Kleines Rätsel am Rande-
[quote]
Mit Delphi7 klappt es bei mir auch. Alerdings will ich es mit Delphi3 Programmieren. ;)

maximov 23. Apr 2004 14:02

Re: Problem mit XML Turtoial von Chack
 
Zitat:

Zitat von citybreaker
Hier kommt er.
Delphi-Quellcode:
for j:=0 to length(NAMES[-1]) do begin

Jeder anständige index läuft von bis Count-1! ALso (wenn das mit dem NAMES[-1] stimmen sollte) so:

Delphi-Quellcode:
for j:=0 to length(NAMES[-1])-1 do begin
// Edit: ooh! Da is ja noch ne zweite seite :oops:

citybreaker 23. Apr 2004 14:11

Re: Problem mit XML Turtoial von Chack
 
Mit dem -1 geht auch nicht.

"Konstantenausdruck verlässt untere Grenzen" :gruebel:

MathiasSimmack 23. Apr 2004 14:13

Re: Problem mit XML Turtoial von Chack
 
Macht ja nix, @maximov ;). Wobei aber genau diese Zeile das Problem aufzeigt.
Da das bspw. von mir benutzte "NAMES" ein normales String-Array ist, darf in der Schleife keinesfalls
Code:
for j:=0 to length(NAMES[color=#ff0000][-1][/color]) do begin
stehen, sondern eben nur
Delphi-Quellcode:
for j := 0 to length(NAMES) do begin
Und wenn Delphi an eben der Stelle meckert, dann ist das für mich eindeutig der Hinweis, dass der Compiler hier mit etwas anderem kollidiert, das zufällig auch "Names" heißt. Delphi unterscheidet ja auch nicht zwischen Groß- und Kleinschreibung.

Darum prüfen, ob irgendwo vorher im Code ein "with something do" steht, oder ob es vielleicht ein Control auf der Form gibt, dem man den Namen "Names" gegeben hat. Usw.

MathiasSimmack 23. Apr 2004 14:56

Re: Problem mit XML Turtoial von Chack
 
Das sehe ich ja jetzt erst:
Zitat:

Zitat von citybreaker
Mit Delphi7 klappt es bei mir auch. Alerdings will ich es mit Delphi3 Programmieren. ;)

Dann ist doch fast schon sicher, dass es an Delphi 3 liegt. Umso erstaunlicher, dass du es dennoch weiter versuchst
Zitat:

Mit dem -1 geht auch nicht.

"Konstantenausdruck verlässt untere Grenzen" :gruebel:
obwohl du inzwischen wissen müsstest, dass das (mit der -1) in dem Fall Quark ist.

Luckie 23. Apr 2004 15:42

Re: Problem mit XML Turtoial von Chack
 
Ganz einfach, von der D3 hat er eine Professional (Delphi für Kids) und er träumt eben davon das Programm mal zu Geld zu machen. ;)

MathiasSimmack 23. Apr 2004 16:48

Re: Problem mit XML Turtoial von Chack
 
Code:
<weise>
  <statement><![CDATA[
    Man soll sich von keinem seine Träume kaputt machen lassen.
  ]]></statement>
</weise>
;)

Aber in dem Fall fürchte ich fast, dass es eine unendliche Geschichte wird. Ich meine, wenn das Problem bei Delphi 3 liegt, dann kann man es nicht lösen. Alles andere würde dann letztlich darauf hinauslaufen:
Zitat:

Wenn der Topf aber nun ein Loch hat, lieber Heinrich, lieber Heinrich?
Musste zumachen, dumme Liese ...
usw.

:mrgreen:

citybreaker 23. Apr 2004 18:44

Re: Problem mit XML Turtoial von Chack
 
XD nä träum ich nicht von. Ich bezweifel stark das man mit einem
Adressbuch Geld machen kann. Oder?! :gruebel:

Werd ich wohl Delphi 7 nehmen und mich wieder melden wenn etwas net klappt. :zwinker:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:29 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