![]() |
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:
Jetzt kommt beim Start immer die Fehlermeldung mit "nicht korrekter Xml Datei"
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. Woran liegt das? Hab die Datei im selben Ordner wie die Exe. |
Re: Problem mit XML Turtoial von Chack
:hi:
Keine Ahnug, aber bei mir hat er beim ISO-Typ gemeckert.
Code:
so hat IE nicht mehr gemeckert.
<?xml version="1.0" encoding="ISO-8859-1" ?>
mfg Tobias |
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:
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.
<?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> @citybreaker: Kleiner Tipp für bessere Fehlermeldungen. Ändere mal deine Infobox wie folgt ab:
Delphi-Quellcode:
dann siehst du was los ist. ;)
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); |
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 |
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. ;) |
Re: Problem mit XML Turtoial von Chack
Übrigens:
Zitat:
|
Re: Problem mit XML Turtoial von Chack
Zitat:
Nun gib es noch das Problem das igendwie nix geladen wird was in der XML Datei steht. Code zum laden steht oben. |
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 |
Re: Problem mit XML Turtoial von Chack
Joa, hab ich gemacht.
Delphi-Quellcode:
procedure TMainFrm.FormCreate(Sender: TObject);
begin fAppPath := ExtractFilePath(Application.Exename); ... end; |
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 |
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)" |
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 |
Re: Problem mit XML Turtoial von Chack
Hier kommt er.
Delphi-Quellcode:
for j:=0 to length(NAMES[-1]) do begin
|
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 |
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.
|
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'." |
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:
Neben einem genauen Blick ins Tutorial von Chakotay empfehle ich auch ein paar Grundlagen. Das wäre bei deiner Ratlosigkeit zur Fehlermeldung
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; Zitat:
@Chakotay: Wie isses? Woll´n wir dein Tutorial noch zum Thema Doctypes und XSL ergänzen? :mrgreen: |
Re: Problem mit XML Turtoial von Chack
Ähm, ne klappt nicht. Ich glaube es liegt mal wieder an D3. >.<
|
Re: Problem mit XML Turtoial von Chack
Hm, mit
Zitat:
|
Re: Problem mit XML Turtoial von Chack
Das selbe wie vorher.
Zitat:
|
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 |
Re: Problem mit XML Turtoial von Chack
Zitat:
Zitat:
|
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. |
Re: Problem mit XML Turtoial von Chack
Hmpf es klappt immer noch nicht.
|
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: |
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. ;) |
Re: Problem mit XML Turtoial von Chack
Zitat:
Delphi-Quellcode:
// Edit: ooh! Da is ja noch ne zweite seite :oops:
for j:=0 to length(NAMES[-1])-1 do begin
|
Re: Problem mit XML Turtoial von Chack
Mit dem -1 geht auch nicht.
"Konstantenausdruck verlässt untere Grenzen" :gruebel: |
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:
stehen, sondern eben nur
for j:=0 to length(NAMES[color=#ff0000][-1][/color]) do begin
Delphi-Quellcode:
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.
for j := 0 to length(NAMES) do begin
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. |
Re: Problem mit XML Turtoial von Chack
Das sehe ich ja jetzt erst:
Zitat:
Zitat:
|
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. ;)
|
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:
:mrgreen: |
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 16:38 Uhr. |
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