Einzelnen Beitrag anzeigen

Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#3

AW: Einfachere Methode, um an XML-Daten zu kommen?

  Alt 17. Okt 2017, 17:37
Hallo,

danke für deine Antwort. Nach einigen Anlaufschwierigkeiten (kein XML Data Binding Wizard im Delphi vorhanden) habe ich den Wizard ausführen können, mit diesem Ergebnis:
Delphi-Quellcode:
unit GetCommonLinkPropertiesResponse2;

interface

uses xmldom, XMLDoc, XMLIntf;

type

{ Forward-Deklarationen }

  IXMLEnvelopeType = interface;
  IXMLBodyType = interface;
  IXMLGetCommonLinkPropertiesResponseType = interface;

{ IXMLEnvelopeType }

  IXMLEnvelopeType = interface(IXMLNode)
    ['{FB884417-D338-4E86-B4C2-246F39EF76C9}']
    { Eigenschaftszugriff }
    function Get_EncodingStyle: string;
    function Get_Body: IXMLBodyType;
    { Methoden & Eigenschaften }
    property EncodingStyle: string read Get_EncodingStyle;
    property Body: IXMLBodyType read Get_Body;
  end;

{ IXMLBodyType }

  IXMLBodyType = interface(IXMLNode)
    ['{5A78AA62-17F2-4D3A-9EF0-887A47D8DC27}']
    { Eigenschaftszugriff }
    function Get_GetCommonLinkPropertiesResponse: IXMLGetCommonLinkPropertiesResponseType;
    { Methoden & Eigenschaften }
    property GetCommonLinkPropertiesResponse: IXMLGetCommonLinkPropertiesResponseType read Get_GetCommonLinkPropertiesResponse;
  end;

{ IXMLGetCommonLinkPropertiesResponseType }

  IXMLGetCommonLinkPropertiesResponseType = interface(IXMLNode)
    ['{0AE1DCD1-8375-4EEB-A82D-74CC3581365F}']
    { Eigenschaftszugriff }
    function Get_NewWANAccessType: string;
    function Get_NewLayer1UpstreamMaxBitRate: string;
    function Get_NewLayer1DownstreamMaxBitRate: string;
    function Get_NewPhysicalLinkStatus: string;
    { Methoden & Eigenschaften }
    property NewWANAccessType: string read Get_NewWANAccessType;
    property NewLayer1UpstreamMaxBitRate: string read Get_NewLayer1UpstreamMaxBitRate;
    property NewLayer1DownstreamMaxBitRate: string read Get_NewLayer1DownstreamMaxBitRate;
    property NewPhysicalLinkStatus: string read Get_NewPhysicalLinkStatus;
  end;

{ Forward-Deklarationen }

  TXMLEnvelopeType = class;
  TXMLBodyType = class;
  TXMLGetCommonLinkPropertiesResponseType = class;

{ TXMLEnvelopeType }

  TXMLEnvelopeType = class(TXMLNode, IXMLEnvelopeType)
  protected
    { IXMLEnvelopeType }
    function Get_EncodingStyle: string;
    function Get_Body: IXMLBodyType;
  public
    procedure AfterConstruction; override;
  end;

{ TXMLBodyType }

  TXMLBodyType = class(TXMLNode, IXMLBodyType)
  protected
    { IXMLBodyType }
    function Get_GetCommonLinkPropertiesResponse: IXMLGetCommonLinkPropertiesResponseType;
  public
    procedure AfterConstruction; override;
  end;

{ TXMLGetCommonLinkPropertiesResponseType }

  TXMLGetCommonLinkPropertiesResponseType = class(TXMLNode, IXMLGetCommonLinkPropertiesResponseType)
  protected
    { IXMLGetCommonLinkPropertiesResponseType }
    function Get_NewWANAccessType: string;
    function Get_NewLayer1UpstreamMaxBitRate: string;
    function Get_NewLayer1DownstreamMaxBitRate: string;
    function Get_NewPhysicalLinkStatus: string;
  end;

{ Globale Funktionen }

function GetEnvelope(Doc: IXMLDocument): IXMLEnvelopeType;
function LoadEnvelope(const FileName: string): IXMLEnvelopeType;
function NewEnvelope: IXMLEnvelopeType;

const
  TargetNamespace = 'http://schemas.xmlsoap.org/soap/envelope/';

implementation

{ Globale Funktionen }

function GetEnvelope(Doc: IXMLDocument): IXMLEnvelopeType;
begin
  Result := Doc.GetDocBinding('Envelope', TXMLEnvelopeType, TargetNamespace) as IXMLEnvelopeType;
end;

function LoadEnvelope(const FileName: string): IXMLEnvelopeType;
begin
  Result := LoadXMLDocument(FileName).GetDocBinding('Envelope', TXMLEnvelopeType, TargetNamespace) as IXMLEnvelopeType;
end;

function NewEnvelope: IXMLEnvelopeType;
begin
  Result := NewXMLDocument.GetDocBinding('Envelope', TXMLEnvelopeType, TargetNamespace) as IXMLEnvelopeType;
end;

{ TXMLEnvelopeType }

procedure TXMLEnvelopeType.AfterConstruction;
begin
  RegisterChildNode('Body', TXMLBodyType);
  inherited;
end;

function TXMLEnvelopeType.Get_EncodingStyle: string;
begin
  Result := AttributeNodes['encodingStyle'].Text;
end;

function TXMLEnvelopeType.Get_Body: IXMLBodyType;
begin
  Result := ChildNodes['Body'] as IXMLBodyType;
end;

{ TXMLBodyType }

procedure TXMLBodyType.AfterConstruction;
begin
  RegisterChildNode('GetCommonLinkPropertiesResponse', TXMLGetCommonLinkPropertiesResponseType);
  inherited;
end;

function TXMLBodyType.Get_GetCommonLinkPropertiesResponse: IXMLGetCommonLinkPropertiesResponseType;
begin
  Result := ChildNodes['GetCommonLinkPropertiesResponse'] as IXMLGetCommonLinkPropertiesResponseType;
end;

{ TXMLGetCommonLinkPropertiesResponseType }

function TXMLGetCommonLinkPropertiesResponseType.Get_NewWANAccessType: string;
begin
  Result := ChildNodes['NewWANAccessType'].Text;
end;

function TXMLGetCommonLinkPropertiesResponseType.Get_NewLayer1UpstreamMaxBitRate: string;
begin
  Result := ChildNodes['NewLayer1UpstreamMaxBitRate'].Text;
end;

function TXMLGetCommonLinkPropertiesResponseType.Get_NewLayer1DownstreamMaxBitRate: string;
begin
  Result := ChildNodes['NewLayer1DownstreamMaxBitRate'].Text;
end;

function TXMLGetCommonLinkPropertiesResponseType.Get_NewPhysicalLinkStatus: string;
begin
  Result := ChildNodes['NewPhysicalLinkStatus'].Text;
end;

end.
Ausprobiert habe ich den Code nicht, weil er in dieser Form für den Zweck unbrauchbar ist:
  1. Es gibt keine XML-Datei irgendwo auf der Platte. Die Daten kommen als String von der Fritzbox. Daraus folgt, dass der Code so umgeschrieben werden müsste, dass er z.B. LoadFromXML statt LoadXMLDocument benutzt. Derzeit habe ich keine Idee, wie man das in eine globale Funktion einarbeiten würde (LoadFromXML ist eine Methode von IXMLDocument).
  2. Weiß der generierte Code die unterschiedlichen Namespaces in den Knoten zu beachten?
  3. Einfach und besser finde ich dieses Mehr an Code nicht. Ich müsste für jeden Datenknoten (Eigenschaft) analoge Methoden und Klassen implementieren. Das sind ne ganze Menge - derzeit knapp 20 in mindestens 7 unterschiedlichen Namespaces/Attributen (oder wie auch immer man das korrekt bezeichnet, gemeint ist "GetCommonLinkPropertiesResponse").

Grüße
Dalai
  Mit Zitat antworten Zitat