Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   wsdl-klasse property auslesen (https://www.delphipraxis.net/201764-wsdl-klasse-property-auslesen.html)

jsp 23. Aug 2019 15:07

wsdl-klasse property auslesen
 
Hallo alle,

ich habe folgende Klassen welche zum auslesen von xml-Files dienen.

Delphi-Quellcode:
  // XML      : NPKNode, global, <complexType>
  // Namespace : http://www.crbnet.ch/crbox_partner
  // ************************************************************************ //
  NPKNode = class(TRemotable)
  private
    Fnumber: string;
    Fnumber_Specified: boolean;
    Ftitle: string;
    Ftitle_Specified: boolean;
    Fdescription: string;
    Fdescription_Specified: boolean;
    FsubNodes: ArrayOfNPKNode;
    FsubNodes_Specified: boolean;
    procedure Setnumber(Index: Integer; const Astring: string);
    function number_Specified(Index: Integer): boolean;
    procedure Settitle(Index: Integer; const Astring: string);
    function title_Specified(Index: Integer): boolean;
    procedure Setdescription(Index: Integer; const Astring: string);
    function description_Specified(Index: Integer): boolean;
    procedure SetsubNodes(Index: Integer; const AArrayOfNPKNode: ArrayOfNPKNode);
    function subNodes_Specified(Index: Integer): boolean;
  public
    destructor Destroy; override;
  published
    property number:     string         Index (IS_OPTN) read Fnumber write Setnumber stored number_Specified;
    property title:      string         Index (IS_OPTN) read Ftitle write Settitle stored title_Specified;
    property description: string         Index (IS_OPTN) read Fdescription write Setdescription stored description_Specified;
    property subNodes:   ArrayOfNPKNode Index (IS_OPTN) read FsubNodes write SetsubNodes stored subNodes_Specified;
  end;

  // ************************************************************************ //
  // XML      : NPKPositionBase, global, <complexType>
  // Namespace : http://www.crbnet.ch/crbox_partner
  // ************************************************************************ //
  NPKPositionBase = class(NPKNode)
  private
    FentryStart: Integer;
    Fhint: string;
    Fhint_Specified: boolean;
    FtitleReadOnly: Integer;
    FprodNormCode: string;
    FprodNormCode_Specified: boolean;
    FpublicationCode: string;
    FpublicationCode_Specified: boolean;
    FdrawingID: string;
    FdrawingID_Specified: boolean;
    procedure Sethint(Index: Integer; const Astring: string);
    function hint_Specified(Index: Integer): boolean;
    procedure SetprodNormCode(Index: Integer; const Astring: string);
    function prodNormCode_Specified(Index: Integer): boolean;
    procedure SetpublicationCode(Index: Integer; const Astring: string);
    function publicationCode_Specified(Index: Integer): boolean;
    procedure SetdrawingID(Index: Integer; const Astring: string);
    function drawingID_Specified(Index: Integer): boolean;
  published
    property entryStart:     Integer read FentryStart write FentryStart;
    property hint:           string  Index (IS_OPTN) read Fhint write Sethint stored hint_Specified;
    property titleReadOnly:  Integer read FtitleReadOnly write FtitleReadOnly;
    property prodNormCode:   string  Index (IS_OPTN) read FprodNormCode write SetprodNormCode stored prodNormCode_Specified;
    property publicationCode: string  Index (IS_OPTN) read FpublicationCode write SetpublicationCode stored publicationCode_Specified;
    property drawingID:      string  Index (IS_OPTN) read FdrawingID write SetdrawingID stored drawingID_Specified;
  end;
Ich lese z.B. das property 'hint' Im debugger sehe ich dass Fhint_Specified true oder false ist.
Wenn der Wert false ist, und ich 'hint' einem String zuweise, gibt es einen Stackoverflow.
Wie komme ich an Fhint_specified ran?

Gruss, Jörn

hoika 23. Aug 2019 15:33

AW: wsdl-klasse property auslesen
 
Hallo,
jetzt musste ich mich doch wirklich mal belesen, was das stored ist ... ;)

https://stackoverflow.com/questions/...word-in-delphi

Kann es sein, dass du das falsch einsetzt?

Setze doch mal einen Breakpoint auf hint_Specified und hint_Specified.
Die scheinen sich ja gegenseitig aufzurufen.

Zitat:

ich 'hint' einem String zuweise
Weist Du hint einem String oder einen String zu?

S:= hint oder hint:= 'bla'

jsp 23. Aug 2019 15:49

AW: wsdl-klasse property auslesen
 
Hallo Heiko

danke erst mal. Das mit dem stored, und wie ich da rankomme, muss ich noch rausfinden.

Und ich weise den hint einem String zu.

S := blubb.hint;

Gruss, Jörn

Rolf Frei 23. Aug 2019 15:52

AW: wsdl-klasse property auslesen
 
Könntest du bitte noch die Implementation der beiden Klassen posten? Deine Klasseninterfaces sehen soweit ganz normal aus. Müsste also an der Implementation liegen. Sind das Klassen einer SOAP Schnittstelle und verwendest du diese dann auch entsprechend mit dem Delphi SOAP Framework oder willst du diese dann irgendwie selber "vergewaltigen"?

Diese XXX_Specified und das stored müssen dich nicht interessieren. Das ist interner Code für das Delphi SOAP Framwork (RTTI), den du nicht abfragen kannst und auch nicht musst. Sobald Hint einen Wert gesetzt bekommt, wird dieses Specified = true. Damit bestimmt das Delphi SOAP Framework, ob eine entsprechende XML-Node geschrieben werden muss oder nicht.

@hoika
Diese Klassen hat der Delphi WSDL Importer erstellt und nicht jsp selber. Das ist also von Delphi erzeugter Code, an dem es nicht liegt.

jsp 26. Aug 2019 07:16

AW: wsdl-klasse property auslesen
 
Danke Rolf

Fakt ist, dass wenn Specified false ist, und ich 'Hint' einem String zuweisen möchte, gibt's einen Stackoveflow,
vermutlich weil einfach Müll in 'Hint' steht.
Ich habe versucht mit length, SizeOf, und wildem Pointergewürge dies abzufangen. Nada.
try except funktioniert zwar, finde ich aber hässlich.
Werde vermutlich die Daten selbst via xPath extrahieren. Für mich ist das irgendwie transparenter, kontrollierter.

Gruss, Jörn

Rolf Frei 5. Sep 2019 10:48

AW: wsdl-klasse property auslesen
 
Jörn,

Habe deine Antwort leider erst heute gesehen. Sorry.

Ich glaube dir ja, dass du einen Stacküberlauf bekommst, aber aufgrund deines Codes sehe ich nicht woran das liegt. Daher wollte ich auch die Implementation der Klassen sehen. Normal ist das auf jeden Fall nicht. Ich nutze viel SOAP und diesen Fehler habe ich bisher noch nie gesehen. Deshalb auch meine Frage in welchen Zusammenhang du diese Klassen nutzt und wie du sie genau benutzt. In Rahmen einer SOAP Kommunikation oder willst du damit ein normales XML File verarbeiten, also etwas wofür das so nicht gemacht ist? Für normale XML Fies gibt es einen anderen Importer. Hast du eventuell den WDSL Importer genutzt, anstelle des normalen XML Imports?

Kannst du denn ein Demoprogramm zusammenstellen, inkl. XML Daten? Ich bin mir sicher, dass da bei deinem Code irgendwo ein Fehler vorliegt, der aber aufgrund der Interfaces nicht ersichtlich ist. Die Interfaces sehen absolut korrekt aus, so wie du sie gepostet hast.

Das ganze per try/except aubzufangen ist definitiv nicht der richtige Weg. Was heist denn "Müll im Hint"?

Gruss
Rolf


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