Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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 14: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 14: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 15: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 15: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 15: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 15: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 15: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 15: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 15: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 15: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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 Uhr.
Seite 1 von 4  1 23     Letzte »    

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 by Thomas Breitkreuz