xml - شمل معالج ربط البيانات واستخدام مساحات أسماء متعددة



delphi xsd (0)

أحاول استخدام معالج ربط بيانات شمل في دلفي سياتل لتوليد واجهات لمجموعة معينة من ملفات شسد. وأنا أعلم أن هناك مشاكل مع استخدام مساحات أسماء متعددة في معالج شمل ولكن لا أستطيع الحصول على "نفسي لفهم المشكلة / الحل بالضبط ....

قبل تزويدك بتفاصيل واسعة، باختصار سؤالي هو: كيفية تغيير التعليمات البرمجية التي تم إنشاؤها لجعلها تفسر البادئات مساحة الاسم التي تختلف في شمل الناتجة كما هي في تعريف شسد؟

شسدس التي يتم إنشاء التعليمات البرمجية هي كما يلي

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="application/registration/2014/04" elementFormDefault="qualified"
    xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:rmrds="datamodel/canonical/datastructures/2014/01/">

    <import schemaLocation="CanonicalDataModel/CanonicalDataModel_DataStructures.xsd" namespace="datamodel/canonical/datastructures/2014/01/">
    </import>

    <element name="ApplicationInstanceRegistrationResponse">
        <complexType>
            <sequence>
                <element name="registrationResponse" type="rmrds:AppInstanceRegistrationType" />
            </sequence>
        </complexType>
    </element>
</schema>

يشير هذا شسد إلى مساحة اسم داتاستروكتوريس مع المحتويات التالية:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="datamodel/canonical/datastructures/2014/01/"
    xmlns:rmrds="datamodel/canonical/datastructures/2014/01/" elementFormDefault="qualified"
    xmlns:rmrbt="datamodel/canonical/basetypes/2014/01/" xmlns:rmrst="datamodel/canonical/simpletypes/2014/01/">

    <import schemaLocation="CanonicalDataModel_BaseTypes.xsd" namespace="datamodel/canonical/basetypes/2014/01/" />
    <import schemaLocation="CanonicalDataModel_SimpleTypes.xsd" namespace="datamodel/canonical/simpletypes/2014/01/" />

    <complexType name="AppInstanceRegistrationType">
        <sequence>
            <element name="key" type="string" />
            <element name="secret" type="string" />
        </sequence>
    </complexType>
</schema>

ملاحظة: هذا basetypes يشير basetypes الأخرى مثل basetypes و simpletypes ولكن هذه لا يتم استخدامها في عنصر أبليكاتيونريجيسترايتيب المشكلة هنا

يبدو الرمز الذي تم إنشاؤه بهذا الشكل (لا يتم عرض سوى الأجزاء ذات الصلة)

type

  IXMLApplicationInstanceRegistrationResponse = interface;
  IXMLAppInstanceRegistrationType_rmrds = interface;

  IXMLApplicationInstanceRegistrationResponse = interface(IXMLNode)
    ['{045B5E7C-83E2-4DB3-B7CD-7C2C28E0E387}']
    { Property Accessors }
    function Get_RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds;
    { Methods & Properties }
    property RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds read Get_RegistrationResponse;
  end;

  IXMLAppInstanceRegistrationType_rmrds = interface(IXMLNode)
    ['{2C1869A9-8B9E-4EC1-9320-5F6683BCB20E}']
    { Property Accessors }
    function Get_Key: String;
    function Get_Secret: String;
    procedure Set_Key(Value: String);
    procedure Set_Secret(Value: String);
    { Methods & Properties }
    property Key: String read Get_Key write Set_Key;
    property Secret: String read Get_Secret write Set_Secret;
  end;

  TXMLApplicationInstanceRegistrationResponse = class;
  TXMLAppInstanceRegistrationType_rmrds = class;

  TXMLApplicationInstanceRegistrationResponse = class(TXMLNode, IXMLApplicationInstanceRegistrationResponse)
  protected
    { IXMLApplicationInstanceRegistrationResponse }
    function Get_RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds;
  public
    procedure AfterConstruction; override;
  end;

{ TXMLAppInstanceRegistrationType_rmrds }

  TXMLAppInstanceRegistrationType_rmrds = class(TXMLNode, IXMLAppInstanceRegistrationType_rmrds)
  protected
    { IXMLAppInstanceRegistrationType_rmrds }
    function Get_Key: String;
    function Get_Secret: String;
    procedure Set_Key(Value: String);
    procedure Set_Secret(Value: String);
  end;

{ Global Functions }

function GetApplicationInstanceRegistrationResponse(Doc: IXMLDocument): IXMLApplicationInstanceRegistrationResponse;
function LoadApplicationInstanceRegistrationResponse(const FileName: string): IXMLApplicationInstanceRegistrationResponse;
function NewApplicationInstanceRegistrationResponse: IXMLApplicationInstanceRegistrationResponse;

const
  TargetNamespace = 'application/registration/2014/04';

implementation

{ Global Functions }

function GetApplicationInstanceRegistrationResponse(Doc: IXMLDocument): IXMLApplicationInstanceRegistrationResponse;
begin
  Result := Doc.GetDocBinding('ApplicationInstanceRegistrationResponse', TXMLApplicationInstanceRegistrationResponse, TargetNamespace) as IXMLApplicationInstanceRegistrationResponse;
end;

function LoadApplicationInstanceRegistrationResponse(const FileName: string): IXMLApplicationInstanceRegistrationResponse;
begin
  Result := LoadXMLDocument(FileName).GetDocBinding('ApplicationInstanceRegistrationResponse', TXMLApplicationInstanceRegistrationResponse, TargetNamespace) as IXMLApplicationInstanceRegistrationResponse;
end;

function NewApplicationInstanceRegistrationResponse: IXMLApplicationInstanceRegistrationResponse;
begin
  Result := NewXMLDocument.GetDocBinding('ApplicationInstanceRegistrationResponse', TXMLApplicationInstanceRegistrationResponse, TargetNamespace) as IXMLApplicationInstanceRegistrationResponse;
end;

{ TXMLApplicationInstanceRegistrationResponse }

procedure TXMLApplicationInstanceRegistrationResponse.AfterConstruction;
begin
  RegisterChildNode('registrationResponse', TXMLAppInstanceRegistrationType_rmrds);
  inherited;
end;

function TXMLApplicationInstanceRegistrationResponse.Get_RegistrationResponse: IXMLAppInstanceRegistrationType_rmrds;
begin
  Result := ChildNodes['registrationResponse'] as IXMLAppInstanceRegistrationType_rmrds;
end;

{ TXMLAppInstanceRegistrationType_rmrds }

function TXMLAppInstanceRegistrationType_rmrds.Get_Key: String;
begin
  Result := ChildNodes['key'].NodeValue;
end;

procedure TXMLAppInstanceRegistrationType_rmrds.Set_Key(Value: String);
begin
  ChildNodes['key'].NodeValue := Value;
end;

function TXMLAppInstanceRegistrationType_rmrds.Get_Secret: String;
begin
  Result := ChildNodes['secret'].NodeValue;
end;

procedure TXMLAppInstanceRegistrationType_rmrds.Set_Secret(Value: String);
begin
  ChildNodes['secret'].NodeValue := Value;
end;
end.

خدمة ريست تزودني بالإجابة التالية شمل:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns10:ApplicationInstanceRegistrationResponse 
   xmlns="datamodel/financial/modelobjects/2014/01/"
   xmlns:ns3="canonical/basetypes/2014/01/"
   xmlns:ns5="datamodel/canonical/datastructures/2014/01/"
   xmlns:ns6="datamodel/canonical/simpletypes/2014/01/" 
   xmlns:ns10="application/registration/2014/04" 

  <ns10:registrationResponse>
    <ns5:key>cac7bacc</ns5:key>
    <ns5:secret>NzY2MDkwNzliNjJkZTE1MWRjNGViNTI4MTk4MmZjZDkzYzhmY2UwNDA5YmJhMjlhYzVlY2JjZGFmNWE1NDg2OA==</ns5:secret>
  </ns10:registrationResponse>
</ns10:ApplicationInstanceRegistrationResponse>

عند إنشاء مثيل مع GetApplicationInstanceRegistrationResponse(XML) محاولة للحصول على قيمة مفتاح أو سر يعطي خطأ أوليفاريانت لأن ChildNodes['key'] في TXMLAppInstanceRegistrationType_rmrds.Get_Key لا يمكن العثور على العقدة. عند استخدام ChildNodes['ns5:key'] يعمل ولكن ns5 ليست بادئة مساحة الاسم ثابتة.

لقد قبلت بالفعل أن التعليمات البرمجية التي تم إنشاؤها بواسطة المعالج يجب أن يتم تغيير يدويا، كما بحث موسع على الشبكة لم تقدم لي أي حل هيكلي على تحديد نتائج المعالج.

فكيف يمكن إصلاح هذا وجعل TXMLAppInstanceRegistrationType_rmrds علم بأن عناصره يتم تعريفها في مخطط datastructure البيانات؟





xml-parsing