Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   An alle Programmierhengste: XML lesen (https://www.delphipraxis.net/159614-alle-programmierhengste-xml-lesen.html)

golffahrer 5. Apr 2011 13:37


An alle Programmierhengste: XML lesen
 
Hallo Freunde,

ich bin neu hier und habe folgendes Problem.

Ich ziehe mir Daten via XML vom Server eines Lieferanten. Mein Code sieht folgender Maßnahmen aus:
Delphi-Quellcode:
...
if n = 'infourl' then
                            begin
                              PostDataStream := TStringStream.Create('');
                              ParamData := TStringStream.Create('');
                              ParamData.WriteString('');
                              ArtikelAdsTable.FieldByName('Infourl').AsString := s;
                              HtmlCodeIdHTTP.Post(s, ParamData, PostDataStream);
                              ArtikelAdsTable.FieldByName('Infotextalles').AsString := PostDataStream.DataString;
                              BodyJvRichEdit.Clear;
                              BodyJvRichEdit.Text := PostDataStream.DataString;
                              if Pos('<BODY>', BodyJvRichEdit.text) <> 0 then
                              begin
                                Start := Pos('<BODY>', BodyJvRichEdit.text)+7;
                                Ende := Pos('</BODY>', BodyJvRichEdit.text);
                                Body := Ende - Start;
                                bodytext := copy(BodyJvRichEdit.text, Pos('<BODY>', BodyJvRichEdit.Text)+6, Body+1);
                                ArtikelAdsTable.FieldByName('Infotextbody').AsString := bodytext;
                              end;
                              if Pos('<body>', BodyJvRichEdit.text) <> 0 then
                              begin
                                Start := Pos('<body>', BodyJvRichEdit.text)+7;
                                Ende := Pos('</body>', BodyJvRichEdit.text);
                                Body := Ende - Start;
                                bodytext := copy(BodyJvRichEdit.text, Pos('<body>', BodyJvRichEdit.text)+6, Body+1);
                                ArtikelAdsTable.FieldByName('Infotextbody').AsString := bodytext;
                              end;
                            end
...
Ich vermute mal, dass er mit der Datenmenge nicht zurecht kommt. Dies ist nur bei einem Artikel so. Der einzige Unterschied ist nur der Textstream. Der hat ein paar Zeichen mehr.
ReceiverBufferSize wurde auf 1000000 gesetzt.

Hat jemand eine Idee, warum er gerade bei einem Artikel ins Essen bricht und das Programm ohne einer Exception killt!?

Über Eure Antworten, wäre ich sehr dankbar.

roboter202 5. Apr 2011 13:44

AW: An alle Programmierhengste
 
Hall

Willkommen in der DP.

Kann deine Frage zwar LEIDER nicht :( beantworten.

Aber am besten Packst du deinen Code beim nächsten mal in die Code / DELPHI tags

Einfach mit DELPHI und /DELPHI oder CODE und /CODE einkalmmer (diese Wörter noch mit [ und ] einklammern) !

Bernhard Geyer 5. Apr 2011 14:06

AW: An alle Programmierhengste
 
Wenn man es mit XML zu tun hat sollte man auch einen XML-Parser zum auslesen nehmen.
Alles andere ist M....

Deep-Sea 5. Apr 2011 14:06

AW: An alle Programmierhengste
 
@roboter202:
Du meinst Die Tags [DELPHI] und [/DELPHI] ?! :-D


@golffahrer:
Wie du holst die Daten VIA XML? XML ist kein Datenprotokoll, du könntest also höchstens Daten holen, die im XML-Format vorliegen.
Aber wie es aussieht holst du doch eine HTML-Seite, oder? :stupid: Gut, die könnte natürlich XHTML sein ...

Bernhard Geyer 5. Apr 2011 14:13

AW: An alle Programmierhengste
 
Zitat:

Zitat von Deep-Sea (Beitrag 1093133)
Aber wie es aussieht holst du doch eine HTML-Seite, oder?

Stimmt, <body> hört sich nach HTML an. Dort nimmt man einen HTML-Parser wie TWebBrowser.

golffahrer 5. Apr 2011 14:31

AW: An alle Programmierhengste
 
Die Frage ist ja, was an meinem Code falsch ist. Es funktioniert ja. Nur bei einem Artikel verabschiedet sich das Tool. Eine Datenbegrenzung kann ja nicht die Ursache sein, oder!?
Was genau für Infos braucht Ihr, damit wir das Problem lösen können!?

P.S.: Viele Wegen führen nach Rom! :-)

Deep-Sea 5. Apr 2011 14:34

AW: An alle Programmierhengste
 
Erst einmal wäre es sehr nett von dir, wenn du deinen Code in die Tags [DELPHI] und [/DELPHI] verpackst, damit man ihn auch besser lesen kann. Danke.

Und dann darfst du auch gerne mal verraten, in welchem Format die Daten denn nun vorliegen.

golffahrer 5. Apr 2011 14:41

AW: An alle Programmierhengste
 
Also, ich sende einen Befehl zum Server des Lieferanten, dann bekomme ich XML zurück. Ich entnehme mir die Daten
aus den entsprechenden XML-Knoten und packe Sie in meine Datenbank. Wie gesagt, es funktioniert alles nur bei
einem Produkt hängt er sich auf und macht nicht mehr weiter. Ich denke es liegt an dem etwas längerem Datenblatt.
Das ist der einzige Unterschied.

Deep-Sea 5. Apr 2011 14:44

AW: An alle Programmierhengste: XML lesen
 
  1. Wo gibst du die TStringStreams wieder frei, die du erzeugst?
  2. Wieso kommt der Block
    Delphi-Quellcode:
    if Pos('<BODY>', BodyJvRichEdit.text) <> 0 then
    zwei mal vor?
  3. Ein XML-Parser ist die bessere, einfachere und stabilere Wahl :roll:

p80286 5. Apr 2011 14:52

AW: An alle Programmierhengste: XML lesen
 
Du solltest, glaube ich, Deinen code einmal kritisch überprüfen:
Delphi-Quellcode:
BodyJvRichEdit.Text := PostDataStream.DataString;
if Pos('<BODY>', BodyJvRichEdit.text) <> 0 then
begin
  Start := Pos('<BODY>', BodyJvRichEdit.text)+7;
  Ende := Pos('</BODY>', BodyJvRichEdit.text);
  Body := Ende - Start;
  bodytext := copy(BodyJvRichEdit.text, Pos('<BODY>', BodyJvRichEdit.Text)+6, Body+1);
  ArtikelAdsTable.FieldByName('Infotextbody').AsStri ng := bodytext;
end;
if Pos('<body>', BodyJvRichEdit.text) <> 0 then
begin
  Start := Pos('<body>', BodyJvRichEdit.text)+7;
  Ende := Pos('</body>', BodyJvRichEdit.text);
  Body := Ende - Start;
..
Da scheint einiges redundant zu sein.
wie wäre es mit
Delphi-Quellcode:
Start:=Pos('<BODY>',uppercase(BodyJvRichEdit.text));
if Start>0 then ...
warum eigentlich ein Richedit? Eine Stringlist würde es doch auch tun?

Gruß
K-H

Edith:
Zitat:

Zitat von golffahrer (Beitrag 1093149)
Ich entnehme mir die Daten
aus den entsprechenden XML-Knoten und packe Sie in meine Datenbank..

Dann sollte man vielleicht doch einen Parser nutzen?

Zitat:

Zitat von golffahrer (Beitrag 1093149)
Wie gesagt, es funktioniert alles nur bei
einem Produkt hängt er sich auf und macht nicht mehr weiter. Ich denke es liegt an dem etwas längerem Datenblatt.
Das ist der einzige Unterschied.

Gewissheit könnte hier ein Debugger verschaffen

Gruß
K-H

roboter202 5. Apr 2011 14:54

AW: An alle Programmierhengste
 
Zitat:

Zitat von Deep-Sea (Beitrag 1093133)
@roboter202:
Du meinst Die Tags [DELPHI] und [/DELPHI] ?! :-D

^^ Wie macht er das ?

ah ich sehe mit [NOPARSE] und[/NOPARSE] :-D

golffahrer 5. Apr 2011 14:58

AW: An alle Programmierhengste: XML lesen
 
1. Ich gebe Sie nirgends frei.
2. Da ich den Inhalt zwischen dem <body> Tag benötige und der mir aber bei einigen Artikel in groß und klein vorliegt, habe ich es 2 Mal.
3. Was genau soll bei einem externen XML-Parser stabiler sein!?

Deep-Sea 5. Apr 2011 15:03

AW: An alle Programmierhengste: XML lesen
 
@golffahrer:
Dann gib sie mal schnell frei :wink:
Z.B. erübrigt sich mit einem Parser das Problem mit der Groß-/Kleinschreibung. Schön, dass du die Fälle "body" und "BODY" verarbeiten kannst, was aber wenn es mal "Body" heißt? :roll: Oder was, wenn der Tag <body> auch mal wo anders benutzt wird, dann findest du das, anstatt den, den du eigentlich möchtest etc. etc. ...


@roboter202:
Und wieder was dazugelernt :wink:

p80286 5. Apr 2011 15:05

AW: An alle Programmierhengste: XML lesen
 
zu 3. Da kannst Du Dir alle verrenkungen Mit Pos und Copy schenken!
zu 2. siehe 3 bzw Uppercase() bzw. CompareText....
zu 1. Wenn Du meinst ....

Gruß
K-H

@DeepSea:
Kannst Du das mal im Klartext machen?
ich hab kein [parse] gesehen

golffahrer 5. Apr 2011 15:11

AW: An alle Programmierhengste: XML lesen
 
Das Freigeben bringt auch nichts.

Es gibt nur <body> in klein und <BODY> in groß, daher nur die 2 Anweisungen.

Gut, dann hat der Parser nichts mit dem eigentlichen Problem zu tun.

Jemand eine Idee!?

Deep-Sea 5. Apr 2011 15:17

AW: An alle Programmierhengste: XML lesen
 
@p80286:
Wie was?! Alles, was du in [NOPARSE] und [/NOPARSE] schreibst, wird eben nicht nach BB-Code geparst, dann kann man eben auch [DELPHI] oder [/DELPHI] schreiben.


Zitat:

Zitat von golffahrer (Beitrag 1093166)
Das Freigeben bringt auch nichts.

Doch: Es gibt kein Speicherleck mehr! :roll:

golffahrer 5. Apr 2011 15:50

AW: An alle Programmierhengste: XML lesen
 
Würde es euch was bringen, wenn ich den Inhalt der .htm mal poste?

Deep-Sea 5. Apr 2011 15:53

AW: An alle Programmierhengste: XML lesen
 
Zitat:

Zitat von golffahrer (Beitrag 1093190)
Würde es euch was bringen, wenn ich den Inhalt der .htm mal poste?

Was ist es denn nun? XML? HTML? XHTML? ...

golffahrer 5. Apr 2011 16:04

AW: An alle Programmierhengste: XML lesen
 
Nochmal von vorne. Ich sende einen Befehl zum Lieferanten und bekomme folgendes zurück:

<item>
<number>123456789</number>
<unitprice>0,00</unitprice>
<description1>Testartikel</description1>
<description2>und so weiter...</description2>
<infourl>
http://testpfad.de/test.HTM
</infourl>
<pictureurl>
http://testpfad.de/test.JPG
</pictureurl>
</item>

Ich entnehme die Daten aus den Knoten und speichere Sie in die Datenbank. Wie Ihr seht gibt es ein <infourl>.
Ich nehme den Pfad http://testpfad.de/test.HTM und streame mir den Inhalt.

Delphi-Quellcode:
 ...
if n = 'infourl' then
                            begin
                              PostDataStream := TStringStream.Create('');
                              ParamData := TStringStream.Create('');
                              ParamData.WriteString('');
                              ArtikelAdsTable.FieldByName('Infourl').AsString := s;
                              HtmlCodeIdHTTP.Post(s, ParamData, PostDataStream);
                              ArtikelAdsTable.FieldByName('Infotextalles').AsString := PostDataStream.DataString;
                              BodyJvRichEdit.Clear;
                              BodyJvRichEdit.Text := PostDataStream.DataString;
                              if Pos('<BODY>', BodyJvRichEdit.text) <> 0 then
                              begin
                                Start := Pos('<BODY>', BodyJvRichEdit.text)+7;
                                Ende := Pos('</BODY>', BodyJvRichEdit.text);
                                Body := Ende - Start;
                                bodytext := copy(BodyJvRichEdit.text, Pos('<BODY>', BodyJvRichEdit.Text)+6, Body+1);
                                ArtikelAdsTable.FieldByName('Infotextbody').AsString := bodytext;
                              end;
                              if Pos('<body>', BodyJvRichEdit.text) <> 0 then
                              begin
                                Start := Pos('<body>', BodyJvRichEdit.text)+7;
                                Ende := Pos('</body>', BodyJvRichEdit.text);
                                Body := Ende - Start;
                                bodytext := copy(BodyJvRichEdit.text, Pos('<body>', BodyJvRichEdit.text)+6, Body+1);
                                ArtikelAdsTable.FieldByName('Infotextbody').AsString := bodytext;
                              end;
                            end
...
Ist es nun verständlicher!?

P.S: Ich weiß man kann es sauberer lösen. Ich bin auch kein Crack, aber es erfüllt "eigentlich" seinen Zweck!

ConnorMcLeod 5. Apr 2011 16:18

AW: An alle Programmierhengste: XML lesen
 
Servus golffahrer,

zeig uns bitte mal das XML von dem Datensatz, bei dem es kracht.

lg W.

golffahrer 5. Apr 2011 16:33

AW: An alle Programmierhengste: XML lesen
 
Meinst Du den Inhalt der .HTM Datei?

p80286 5. Apr 2011 16:37

AW: An alle Programmierhengste: XML lesen
 
Zitat:

Zitat von Deep-Sea (Beitrag 1093170)
@p80286:
Wie was?! Alles, was du in [NOPARSE] und [/NOPARSE] schreibst, wird eben nicht nach BB-Code geparst, dann kann man eben auch [DELPHI] oder [/DELPHI] schreiben.

Naja beinahe, Danke! Gutes Beispiel

Gruß
K-H

Edith:
Zitat:

Zitat von golffahrer (Beitrag 1093208)
Meinst Du den Inhalt der .HTM Datei?

Jo das wäre gut!

golffahrer 5. Apr 2011 16:42

AW: An alle Programmierhengste: XML lesen
 
Anbei der Link: Hier

p80286 5. Apr 2011 17:01

AW: An alle Programmierhengste: XML lesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So geht's:
Delphi-Quellcode:
var
  start,
  ende : integer;
  ll:tstringlist;
begin
  ll:=tstringlist.Create;
  ll.LoadFromFile('C:\temp\test.htm');
  start:=pos('<body>',ll.Text);
  if start>0 then begin
    ende:=pos('</body>',ll.Text);
    form1.Memo1.Text:=copy(ll.Text,start+6,ende-(start+6));
  end;
  ll.free;
end;
(ich weiß dafür gibt's keinen Schönheitspreis)
Gruß
K-H

Edith:
die Test.htm hab ich mal angehängt.

himitsu 5. Apr 2011 17:09

AW: An alle Programmierhengste: XML lesen
 
Zitat:

P.S: Ich weiß man kann es sauberer lösen. Ich bin auch kein Crack, aber es erfüllt "eigentlich" seinen Zweck!
Gerade da sollte man doch etwas nehmen, was mit XML umgehen kann, als alles selber zu versuchen?
Also einen XML-Parser, welcher genau dafür gedacht ist.
Und wenn es wirklich seinen Zweck erfüllen würde, dann würde es doch wohl funktionieren? :zwinker:

PS:
Zitat:

<item>
<number>123456789</number>
<unitprice>0,00</unitprice>
<description1>Testartikel</description1>
<description2>und so weiter...</description2>
<infourl>
http://testpfad.de/test.HTM
</infourl>
<pictureurl>
http://testpfad.de/test.JPG
</pictureurl>
</item>
Ich sehe hier weder body noch BODY. :gruebel:

Wobei das Ganze irgendwie ein bissl nach XML-RPC aussieht und dafür hat INDY und/oder MSXML sogar was direkt eingebaut.
http://www.delphipraxis.net/111790-x...-download.html

ConnorMcLeod 5. Apr 2011 17:10

AW: An alle Programmierhengste: XML lesen
 
IMHO holt er sich den Inhalt der Url vom Tag <infourl> und dann krachts.

Die Seite hat 39248 Bytes (lt. Notepad++). Passt das in Dein Tabellenfeld?
Wenn ja, dann prüf das mal auf Sonderzeichen und chr(0)'s => Unicode vs. utf-8 und so. Kann sein, dass die DB damit ein Problem hat.

Und ... beherzige den Tip bez. UpperCase('body'), dann wird der Code übersichtlicher und Du musst nur eine Stelle im Quelltext berücksichtigen.

lg W

golffahrer 5. Apr 2011 17:34

AW: An alle Programmierhengste: XML lesen
 
es funktioniert immer noch nicht! :(
verdammte sch...
Wie könnte man das umgehen mit den Sonderzeichen. Guter Ansatz, oder?

P.S: Habe den Inhalt manuell in die Datenbank eingetragen, also das geht. Das Memo-Feld frißt das.

ConnorMcLeod 5. Apr 2011 17:46

AW: An alle Programmierhengste: XML lesen
 
OK, dann versuchs mal programmatisch mit einem Teil des HTML-Strings. Solange, bis es wieder kracht, dann hast Du das Zeichen, das dran schuld ist, IMHO.

golffahrer 5. Apr 2011 17:59

AW: An alle Programmierhengste: XML lesen
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1093236)
OK, dann versuchs mal programmatisch mit einem Teil des HTML-Strings. Solange, bis es wieder kracht, dann hast Du das Zeichen, das dran schuld ist, IMHO.

Habe den Inhalt manuell in die Datenbank eingetragen, also das geht. Das Memo-Feld frißt das. Hmmmm... Ich weiss nicht so recht.

ConnorMcLeod 5. Apr 2011 18:02

AW: An alle Programmierhengste: XML lesen
 
Hab ich schon das vorige Mal gelesen ...
offenbar gibt es einen Unterschied zw. händisch und programmatisch ...
Bugs suchen ist leider mehr Aufwand als Code schreiben. Da musst Du durch ;-)

golffahrer 5. Apr 2011 19:02

AW: An alle Programmierhengste: XML lesen
 
wie sehen die anderen das? sollte doch egal sein, oder?

ULIK 5. Apr 2011 19:53

AW: An alle Programmierhengste: XML lesen
 
Schmeiß halt mal den Debugger an, step durch deinen Code und schau nach, an welcher Stelle es mit welchen Werten kracht!

Grüße,
Uli

gmc616 6. Apr 2011 13:07

AW: An alle Programmierhengste: XML lesen
 
Ich werf mal die Delphi "XML-Datenbindung" in die Runde.

Im Delphi 2009 zu finden, wenn du ein Projekt geöffnet hast, unter Datei->Neu->Weitere->Objektgalerie->XML

Hab damit eigentlich ganz gute Erfahrungen gemacht.


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