![]() |
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:
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.
...
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 ... 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. |
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) ! |
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.... |
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 ... |
AW: An alle Programmierhengste
Zitat:
|
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! :-) |
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. |
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. |
AW: An alle Programmierhengste: XML lesen
|
AW: An alle Programmierhengste: XML lesen
Du solltest, glaube ich, Deinen code einmal kritisch überprüfen:
Delphi-Quellcode:
Da scheint einiges redundant zu sein.
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; .. wie wäre es mit
Delphi-Quellcode:
warum eigentlich ein Richedit? Eine Stringlist würde es doch auch tun?
Start:=Pos('<BODY>',uppercase(BodyJvRichEdit.text));
if Start>0 then ... Gruß K-H Edith: Zitat:
Zitat:
Gruß K-H |
AW: An alle Programmierhengste
Zitat:
ah ich sehe mit [NOPARSE] und[/NOPARSE] :-D |
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!? |
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: |
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 |
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!? |
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:
|
AW: An alle Programmierhengste: XML lesen
Würde es euch was bringen, wenn ich den Inhalt der .htm mal poste?
|
AW: An alle Programmierhengste: XML lesen
Zitat:
|
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> ![]() </infourl> <pictureurl> ![]() </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 ![]()
Delphi-Quellcode:
Ist es nun verständlicher!?
...
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 ... P.S: Ich weiß man kann es sauberer lösen. Ich bin auch kein Crack, aber es erfüllt "eigentlich" seinen Zweck! |
AW: An alle Programmierhengste: XML lesen
Servus golffahrer,
zeig uns bitte mal das XML von dem Datensatz, bei dem es kracht. lg W. |
AW: An alle Programmierhengste: XML lesen
Meinst Du den Inhalt der .HTM Datei?
|
AW: An alle Programmierhengste: XML lesen
Zitat:
Gruß K-H Edith: Zitat:
|
AW: An alle Programmierhengste: XML lesen
Anbei der Link:
![]() |
AW: An alle Programmierhengste: XML lesen
Liste der Anhänge anzeigen (Anzahl: 1)
So geht's:
Delphi-Quellcode:
(ich weiß dafür gibt's keinen Schönheitspreis)
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; Gruß K-H Edith: die Test.htm hab ich mal angehängt. |
AW: An alle Programmierhengste: XML lesen
Zitat:
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:
Wobei das Ganze irgendwie ein bissl nach XML-RPC aussieht und dafür hat INDY und/oder MSXML sogar was direkt eingebaut. ![]() |
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 |
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. |
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.
|
AW: An alle Programmierhengste: XML lesen
Zitat:
|
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 ;-) |
AW: An alle Programmierhengste: XML lesen
wie sehen die anderen das? sollte doch egal sein, oder?
|
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 |
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