AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Einfachere Methode, um an XML-Daten zu kommen?
Thema durchsuchen
Ansicht
Themen-Optionen

Einfachere Methode, um an XML-Daten zu kommen?

Ein Thema von Dalai · begonnen am 14. Okt 2017 · letzter Beitrag vom 24. Okt 2017
 
Benutzerbild von Dalai
Dalai

Registriert seit: 9. Apr 2006
1.684 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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 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