diff --git a/Forms/MainFrm.dfm b/Forms/MainFrm.dfm index f3b5e40..641bd33 100644 --- a/Forms/MainFrm.dfm +++ b/Forms/MainFrm.dfm @@ -48,7 +48,6 @@ object MainForm: TMainForm Anchors = [akLeft, akTop, akBottom] Caption = ' Output ' TabOrder = 1 - ExplicitHeight = 204 DesignSize = ( 422 225) @@ -83,6 +82,10 @@ object MainForm: TMainForm TabOrder = 2 object spFile: TTabSheet TabVisible = False + ExplicitLeft = 0 + ExplicitTop = 0 + ExplicitWidth = 0 + ExplicitHeight = 0 object lblFile: TLabel Left = 4 Top = 7 @@ -188,7 +191,6 @@ object MainForm: TMainForm Default = True TabOrder = 3 OnClick = btnGenerateClick - ExplicitTop = 258 end object btnClose: TButton Left = 355 @@ -200,7 +202,6 @@ object MainForm: TMainForm Caption = '&Close' TabOrder = 4 OnClick = btnCloseClick - ExplicitTop = 258 end object btnHints: TButton Left = 7 @@ -212,7 +213,6 @@ object MainForm: TMainForm Caption = 'Generate blank &Hints file' TabOrder = 2 OnClick = btnHintsClick - ExplicitTop = 258 end object DefaultEditStyle: TcxDefaultEditStyleController Style.HotTrack = False diff --git a/Forms/MainFrm.pas b/Forms/MainFrm.pas index 1a3c997..d254936 100644 --- a/Forms/MainFrm.pas +++ b/Forms/MainFrm.pas @@ -80,6 +80,7 @@ uses FileCtrl, SysUtils, Windows, + Generics.Collections, MSXMLDOM, MSXML2_TLB, @@ -409,37 +410,98 @@ end; procedure THintsDelphiXMLDataBindingGenerator.ProcessEnumerations; + + procedure ProcessEnumeration(ABindingEnumeration: TXMLDataBindingEnumeration; AHintEnumeration: IXMLEnumeration); + var + hintMemberIndex: Integer; + memberName: String; + memberIndex: Integer; + + begin + for hintMemberIndex := 0 to Pred(AHintEnumeration.Count) do + begin + memberName := AHintEnumeration.Member[hintMemberIndex].Name; + + for memberIndex := 0 to Pred(ABindingEnumeration.MemberCount) do + begin + if ABindingEnumeration.Members[memberIndex].Name = memberName then + begin + ABindingEnumeration.Members[memberIndex].TranslatedName := AHintEnumeration[hintMemberIndex].Text; + Break; + end; + end; + end; + end; + + + function GetNewMembers(ABindingEnumeration: TXMLDataBindingEnumeration; AHintEnumeration: IXMLEnumeration): TList; + var + hintMemberIndex: Integer; + member: TXMLDataBindingEnumerationMember; + + begin + Result := TList.Create; + + for hintMemberIndex := 0 to Pred(AHintEnumeration.Count) do + begin + member := TXMLDataBindingEnumerationMember.Create(Self, ABindingEnumeration, AHintEnumeration[hintMemberIndex].Name); + member.TranslatedName := AHintEnumeration[hintMemberIndex].Text; + Result.Add(member); + end; + end; + + var itemIndex: Integer; enumeration: IXMLEnumeration; schemaItem: TXMLDataBindingItem; enumerationItem: TXMLDataBindingEnumeration; - hintMemberIndex: Integer; - memberName: String; - memberIndex: Integer; + propertyItem: TXMLDataBindingSimpleProperty; + newMembers: TList; + newPropertyItem: TXMLDataBindingItemProperty; begin for itemIndex := 0 to Pred(Hints.Enumerations.Count) do begin enumeration := Hints.Enumerations[itemIndex]; - if FindNode(enumeration.Schema, enumeration.XPath, schemaItem) and - (schemaItem.ItemType = itEnumeration) then + if FindNode(enumeration.Schema, enumeration.XPath, schemaItem) then begin - enumerationItem := TXMLDataBindingEnumeration(schemaItem); - - for hintMemberIndex := 0 to Pred(enumeration.Count) do - begin - memberName := enumeration.Member[hintMemberIndex].Name; - - for memberIndex := 0 to Pred(enumerationItem.MemberCount) do - begin - if enumerationItem.Members[memberIndex].Name = memberName then + case schemaItem.ItemType of + itEnumeration: begin - enumerationItem.Members[memberIndex].TranslatedName := enumeration[hintMemberIndex].Text; - Break; + enumerationItem := TXMLDataBindingEnumeration(schemaItem); + + if enumeration.HasReplaceMembers and enumeration.ReplaceMembers then + begin + newMembers := GetNewMembers(enumerationItem, enumeration); + try + enumerationItem.ReplaceMembers(newMembers); + finally + FreeAndNil(newMembers); + end; + end else + ProcessEnumeration(TXMLDataBindingEnumeration(schemaItem), enumeration); + end; + + itProperty: + if TXMLDataBindingProperty(schemaItem).PropertyType = ptSimple then + begin + propertyItem := TXMLDataBindingSimpleProperty(schemaItem); + if propertyItem.DataType.Name = 'string' then + begin + enumerationItem := TXMLDataBindingEnumeration.Create(Self, schemaItem.SchemaItem, nil, schemaItem.Name); + newPropertyItem := TXMLDataBindingItemProperty.Create(Self, propertyItem.SchemaItem, propertyItem.Name, enumerationItem); + + newMembers := GetNewMembers(enumerationItem, enumeration); + try + enumerationItem.ReplaceMembers(newMembers); + ReplaceItem(schemaItem, newPropertyItem, False); + finally + FreeAndNil(newMembers); + end; + end; end; - end; end; end; end; diff --git a/Units/DataBindingHintsXML.pas b/Units/DataBindingHintsXML.pas index e40cff4..3057044 100644 --- a/Units/DataBindingHintsXML.pas +++ b/Units/DataBindingHintsXML.pas @@ -1,16 +1,18 @@ { X2Software XML Data Binding - Generated on: 29-9-2009 14:31:13 - Generated from: P:\test\XMLDataBinding\XSD\DataBindingHints.xsd + Generated on: 22/04/2020 11:59:03 + Generated from: P:\x2xmldatabinding\XSD\DataBindingHints.xsd } unit DataBindingHintsXML; interface uses Classes, + SysUtils, XMLDoc, - XMLIntf; + XMLIntf, + XMLDataBindingUtils; type { Forward declarations for DataBindingHints } @@ -30,7 +32,8 @@ type Contains hints and mappings for the data binding output } IXMLDataBindingHints = interface(IXMLNode) - ['{434CBC09-8E33-4970-9C4A-535B4C898185}'] + ['{8122E348-4BE1-4436-AD2A-DAFED0CFA0C4}'] + procedure XSDValidateDocument(AStrict: Boolean = False); function GetHasEnumerations: Boolean; function GetEnumerations: IXMLEnumerations; function GetHasDocumentElements: Boolean; @@ -50,8 +53,18 @@ type property Properties: IXMLProperties read GetProperties; end; + IXMLEnumerationsEnumerator = interface + ['{725760E4-70A5-47A6-B91B-C240F1FADA60}'] + function GetCurrent: IXMLEnumeration; + function MoveNext: Boolean; + property Current: IXMLEnumeration read GetCurrent; + end; + + IXMLEnumerations = interface(IXMLNodeCollection) - ['{115ECCB0-407B-476E-AA99-63F584F883F7}'] + ['{509EAF84-A4BF-4F15-B77C-98B58792A9C3}'] + function GetEnumerator: IXMLEnumerationsEnumerator; + function Get_Enumeration(Index: Integer): IXMLEnumeration; function Add: IXMLEnumeration; function Insert(Index: Integer): IXMLEnumeration; @@ -59,8 +72,21 @@ type property Enumeration[Index: Integer]: IXMLEnumeration read Get_Enumeration; default; end; + IXMLEnumerationEnumerator = interface + ['{8A1AF158-2AF3-49FB-9CFC-46897D8AF28C}'] + function GetCurrent: IXMLMember; + function MoveNext: Boolean; + property Current: IXMLMember read GetCurrent; + end; + + IXMLEnumeration = interface(IXMLNodeCollection) - ['{4B776A26-325C-4589-8F5B-88E2EE86DEC6}'] + ['{01A5E078-6EEB-40A0-BF72-972B467AD983}'] + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + + function GetEnumerator: IXMLEnumerationEnumerator; + function Get_Member(Index: Integer): IXMLMember; function Add: IXMLMember; function Insert(Index: Integer): IXMLMember; @@ -69,29 +95,50 @@ type function GetSchema: WideString; function GetXPath: WideString; + function GetHasReplaceMembers: Boolean; + function GetReplaceMembers: Boolean; procedure SetSchema(const Value: WideString); procedure SetXPath(const Value: WideString); + procedure SetReplaceMembers(const Value: Boolean); property Schema: WideString read GetSchema write SetSchema; property XPath: WideString read GetXPath write SetXPath; + property HasReplaceMembers: Boolean read GetHasReplaceMembers; + property ReplaceMembers: Boolean read GetReplaceMembers write SetReplaceMembers; end; IXMLMember = interface(IXMLNode) - ['{2575F0F6-EDCA-4CC6-B532-94833BCFAB64}'] + ['{C58EF7F8-E182-47A3-B591-550A51AA0751}'] + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetName: WideString; + function GetValue: WideString; procedure SetName(const Value: WideString); + procedure SetValue(const Value: WideString); property Name: WideString read GetName write SetName; + property Value: WideString read GetValue write SetValue; end; + IXMLDocumentElementsEnumerator = interface + ['{D58F3363-3E98-4EF9-9A9E-F57B7C4639D7}'] + function GetCurrent: IXMLDocumentElement; + function MoveNext: Boolean; + property Current: IXMLDocumentElement read GetCurrent; + end; + + { If present, only elements which are included in this list will be marked as a Document Element. } IXMLDocumentElements = interface(IXMLNodeCollection) - ['{8D3A5543-68FF-4101-9874-639A39E33950}'] + ['{D991E86F-3D42-4B05-BB90-10AF42324FE1}'] + function GetEnumerator: IXMLDocumentElementsEnumerator; + function Get_DocumentElement(Index: Integer): IXMLDocumentElement; function Add: IXMLDocumentElement; function Insert(Index: Integer): IXMLDocumentElement; @@ -100,7 +147,10 @@ type end; IXMLDocumentElement = interface(IXMLNode) - ['{3DFD0655-26DA-4237-ACEC-BB7CB3354DD2}'] + ['{0FD90406-67B2-4076-870C-47DA8E8582ED}'] + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetSchema: WideString; function GetXPath: WideString; @@ -111,8 +161,18 @@ type property XPath: WideString read GetXPath write SetXPath; end; + IXMLInterfacesEnumerator = interface + ['{A1433E41-A316-4DBD-ADC2-7EA490CEFCB3}'] + function GetCurrent: IXMLInterfaceName; + function MoveNext: Boolean; + property Current: IXMLInterfaceName read GetCurrent; + end; + + IXMLInterfaces = interface(IXMLNodeCollection) - ['{E70E67E3-C108-4015-B996-962D800BE555}'] + ['{6A2EDBB5-36FE-4CA6-B3B9-1AC7A016E372}'] + function GetEnumerator: IXMLInterfacesEnumerator; + function Get_InterfaceName(Index: Integer): IXMLInterfaceName; function Add: IXMLInterfaceName; function Insert(Index: Integer): IXMLInterfaceName; @@ -121,19 +181,35 @@ type end; IXMLInterfaceName = interface(IXMLNode) - ['{2B8126E7-2F89-4E5D-89E3-4F5F7AEE35E9}'] + ['{F0057FA9-92D8-47C5-AC29-6A045595B7F0}'] + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetSchema: WideString; function GetXPath: WideString; + function GetValue: WideString; procedure SetSchema(const Value: WideString); procedure SetXPath(const Value: WideString); + procedure SetValue(const Value: WideString); property Schema: WideString read GetSchema write SetSchema; property XPath: WideString read GetXPath write SetXPath; + property Value: WideString read GetValue write SetValue; end; + IXMLPropertiesEnumerator = interface + ['{4FDE9618-2177-4D53-8B14-5E81E397E084}'] + function GetCurrent: IXMLPropertyName; + function MoveNext: Boolean; + property Current: IXMLPropertyName read GetCurrent; + end; + + IXMLProperties = interface(IXMLNodeCollection) - ['{88260AE1-1C40-4F0F-AA44-C61EDAA53B38}'] + ['{38320F29-9D8C-4158-B0F6-8E1D1FD31EB9}'] + function GetEnumerator: IXMLPropertiesEnumerator; + function Get_PropertyName(Index: Integer): IXMLPropertyName; function Add: IXMLPropertyName; function Insert(Index: Integer): IXMLPropertyName; @@ -142,7 +218,10 @@ type end; IXMLPropertyName = interface(IXMLNode) - ['{DB714E5D-E62B-44C4-B7D4-0623887BCDF6}'] + ['{F99D3125-B2DE-4A4A-88D0-DBCB50C75C59}'] + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetSchema: WideString; function GetXPath: WideString; @@ -155,10 +234,11 @@ type { Classes for DataBindingHints } - TXMLDataBindingHints = class(TXMLNode, IXMLDataBindingHints) + TXMLDataBindingHints = class(TX2XMLNode, IXMLDataBindingHints) public procedure AfterConstruction; override; protected + procedure XSDValidateDocument(AStrict: Boolean = False); function GetHasEnumerations: Boolean; function GetEnumerations: IXMLEnumerations; function GetHasDocumentElements: Boolean; @@ -169,48 +249,86 @@ type function GetProperties: IXMLProperties; end; - TXMLEnumerations = class(TXMLNodeCollection, IXMLEnumerations) + TXMLEnumerationsEnumerator = class(TXMLNodeCollectionEnumerator, IXMLEnumerationsEnumerator) + protected + function GetCurrent: IXMLEnumeration; + end; + + + TXMLEnumerations = class(TX2XMLNodeCollection, IXMLEnumerations) public procedure AfterConstruction; override; protected + function GetEnumerator: IXMLEnumerationsEnumerator; + function Get_Enumeration(Index: Integer): IXMLEnumeration; function Add: IXMLEnumeration; function Insert(Index: Integer): IXMLEnumeration; end; - TXMLEnumeration = class(TXMLNodeCollection, IXMLEnumeration) + TXMLEnumerationEnumerator = class(TXMLNodeCollectionEnumerator, IXMLEnumerationEnumerator) + protected + function GetCurrent: IXMLMember; + end; + + + TXMLEnumeration = class(TX2XMLNodeCollection, IXSDValidate, IXSDValidateStrict, IXMLEnumeration) public procedure AfterConstruction; override; protected + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + + function GetEnumerator: IXMLEnumerationEnumerator; + function Get_Member(Index: Integer): IXMLMember; function Add: IXMLMember; function Insert(Index: Integer): IXMLMember; function GetSchema: WideString; function GetXPath: WideString; + function GetHasReplaceMembers: Boolean; + function GetReplaceMembers: Boolean; procedure SetSchema(const Value: WideString); procedure SetXPath(const Value: WideString); + procedure SetReplaceMembers(const Value: Boolean); end; - TXMLMember = class(TXMLNode, IXMLMember) + TXMLMember = class(TX2XMLNode, IXSDValidate, IXSDValidateStrict, IXMLMember) protected + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetName: WideString; + function GetValue: WideString; procedure SetName(const Value: WideString); + procedure SetValue(const Value: WideString); end; - TXMLDocumentElements = class(TXMLNodeCollection, IXMLDocumentElements) + TXMLDocumentElementsEnumerator = class(TXMLNodeCollectionEnumerator, IXMLDocumentElementsEnumerator) + protected + function GetCurrent: IXMLDocumentElement; + end; + + + TXMLDocumentElements = class(TX2XMLNodeCollection, IXMLDocumentElements) public procedure AfterConstruction; override; protected + function GetEnumerator: IXMLDocumentElementsEnumerator; + function Get_DocumentElement(Index: Integer): IXMLDocumentElement; function Add: IXMLDocumentElement; function Insert(Index: Integer): IXMLDocumentElement; end; - TXMLDocumentElement = class(TXMLNode, IXMLDocumentElement) + TXMLDocumentElement = class(TX2XMLNode, IXSDValidate, IXSDValidateStrict, IXMLDocumentElement) protected + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetSchema: WideString; function GetXPath: WideString; @@ -218,35 +336,59 @@ type procedure SetXPath(const Value: WideString); end; - TXMLInterfaces = class(TXMLNodeCollection, IXMLInterfaces) + TXMLInterfacesEnumerator = class(TXMLNodeCollectionEnumerator, IXMLInterfacesEnumerator) + protected + function GetCurrent: IXMLInterfaceName; + end; + + + TXMLInterfaces = class(TX2XMLNodeCollection, IXMLInterfaces) public procedure AfterConstruction; override; protected + function GetEnumerator: IXMLInterfacesEnumerator; + function Get_InterfaceName(Index: Integer): IXMLInterfaceName; function Add: IXMLInterfaceName; function Insert(Index: Integer): IXMLInterfaceName; end; - TXMLInterfaceName = class(TXMLNode, IXMLInterfaceName) + TXMLInterfaceName = class(TX2XMLNode, IXSDValidate, IXSDValidateStrict, IXMLInterfaceName) protected + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetSchema: WideString; function GetXPath: WideString; + function GetValue: WideString; procedure SetSchema(const Value: WideString); procedure SetXPath(const Value: WideString); + procedure SetValue(const Value: WideString); end; - TXMLProperties = class(TXMLNodeCollection, IXMLProperties) + TXMLPropertiesEnumerator = class(TXMLNodeCollectionEnumerator, IXMLPropertiesEnumerator) + protected + function GetCurrent: IXMLPropertyName; + end; + + + TXMLProperties = class(TX2XMLNodeCollection, IXMLProperties) public procedure AfterConstruction; override; protected + function GetEnumerator: IXMLPropertiesEnumerator; + function Get_PropertyName(Index: Integer): IXMLPropertyName; function Add: IXMLPropertyName; function Insert(Index: Integer): IXMLPropertyName; end; - TXMLPropertyName = class(TXMLNode, IXMLPropertyName) + TXMLPropertyName = class(TX2XMLNode, IXSDValidate, IXSDValidateStrict, IXMLPropertyName) protected + procedure XSDValidate; + procedure XSDValidateStrict(AResult: IXSDValidateStrictResult); + function GetSchema: WideString; function GetXPath: WideString; @@ -259,6 +401,7 @@ type function GetDataBindingHints(ADocument: XMLIntf.IXMLDocument): IXMLDataBindingHints; function LoadDataBindingHints(const AFileName: String): IXMLDataBindingHints; function LoadDataBindingHintsFromStream(AStream: TStream): IXMLDataBindingHints; + function LoadDataBindingHintsFromString(const AString: String{$IF CompilerVersion >= 20}; AEncoding: TEncoding = nil; AOwnsEncoding: Boolean = True{$IFEND}): IXMLDataBindingHints; function NewDataBindingHints: IXMLDataBindingHints; @@ -268,7 +411,7 @@ const implementation uses - SysUtils; + Variants; { Document functions } function GetDataBindingHints(ADocument: XMLIntf.IXMLDocument): IXMLDataBindingHints; @@ -291,6 +434,24 @@ begin Result := GetDataBindingHints(doc); end; +function LoadDataBindingHintsFromString(const AString: String{$IF CompilerVersion >= 20}; AEncoding: TEncoding; AOwnsEncoding: Boolean{$IFEND}): IXMLDataBindingHints; +var + stream: TStringStream; + +begin + {$IF CompilerVersion >= 20} + if Assigned(AEncoding) then + stream := TStringStream.Create(AString, AEncoding, AOwnsEncoding) + else + {$IFEND} + stream := TStringStream.Create(AString); + try + Result := LoadDataBindingHintsFromStream(stream); + finally + FreeAndNil(stream); + end; +end; + function NewDataBindingHints: IXMLDataBindingHints; begin Result := NewXMLDocument.GetDocBinding('DataBindingHints', TXMLDataBindingHints, TargetNamespace) as IXMLDataBindingHints @@ -308,6 +469,14 @@ begin inherited; end; +procedure TXMLDataBindingHints.XSDValidateDocument(AStrict: Boolean); +begin + if AStrict then + XMLDataBindingUtils.XSDValidateStrict(Self) + else + XMLDataBindingUtils.XSDValidate(Self); +end; + function TXMLDataBindingHints.GetHasEnumerations: Boolean; begin Result := Assigned(ChildNodes.FindNode('Enumerations')); @@ -352,6 +521,11 @@ begin Result := (ChildNodes['Properties'] as IXMLProperties); end; +function TXMLEnumerationsEnumerator.GetCurrent: IXMLEnumeration; +begin + Result := (inherited GetCurrent as IXMLEnumeration); +end; + procedure TXMLEnumerations.AfterConstruction; begin RegisterChildNode('Enumeration', TXMLEnumeration); @@ -362,6 +536,11 @@ begin inherited; end; +function TXMLEnumerations.GetEnumerator: IXMLEnumerationsEnumerator; +begin + Result := TXMLEnumerationsEnumerator.Create(Self); +end; + function TXMLEnumerations.Get_Enumeration(Index: Integer): IXMLEnumeration; begin Result := (List[Index] as IXMLEnumeration); @@ -377,6 +556,11 @@ begin Result := (AddItem(Index) as IXMLEnumeration); end; +function TXMLEnumerationEnumerator.GetCurrent: IXMLMember; +begin + Result := (inherited GetCurrent as IXMLMember); +end; + procedure TXMLEnumeration.AfterConstruction; begin RegisterChildNode('Member', TXMLMember); @@ -387,6 +571,21 @@ begin inherited; end; +procedure TXMLEnumeration.XSDValidate; +begin + CreateRequiredAttributes(Self, ['Schema', 'XPath']); +end; + +procedure TXMLEnumeration.XSDValidateStrict(AResult: IXSDValidateStrictResult); +begin + ValidateRequiredAttributes(AResult, Self, ['Schema', 'XPath']); +end; + +function TXMLEnumeration.GetEnumerator: IXMLEnumerationEnumerator; +begin + Result := TXMLEnumerationEnumerator.Create(Self); +end; + function TXMLEnumeration.Get_Member(Index: Integer): IXMLMember; begin Result := (List[Index] as IXMLMember); @@ -412,14 +611,40 @@ begin Result := AttributeNodes['XPath'].Text; end; +function TXMLEnumeration.GetHasReplaceMembers: Boolean; +begin + Result := Assigned(AttributeNodes.FindNode('ReplaceMembers')); +end; + + +function TXMLEnumeration.GetReplaceMembers: Boolean; +begin + Result := AttributeNodes['ReplaceMembers'].NodeValue; +end; + procedure TXMLEnumeration.SetSchema(const Value: WideString); begin - SetAttribute('Schema', Value); + SetAttribute('Schema', GetValidXMLText(Value)); end; procedure TXMLEnumeration.SetXPath(const Value: WideString); begin - SetAttribute('XPath', Value); + SetAttribute('XPath', GetValidXMLText(Value)); +end; + +procedure TXMLEnumeration.SetReplaceMembers(const Value: Boolean); +begin + SetAttribute('ReplaceMembers', BoolToXML(Value)); +end; + +procedure TXMLMember.XSDValidate; +begin + CreateRequiredAttributes(Self, ['Name']); +end; + +procedure TXMLMember.XSDValidateStrict(AResult: IXSDValidateStrictResult); +begin + ValidateRequiredAttributes(AResult, Self, ['Name']); end; function TXMLMember.GetName: WideString; @@ -427,9 +652,24 @@ begin Result := AttributeNodes['Name'].Text; end; +function TXMLMember.GetValue: WideString; +begin + Result := VarToStr(GetNodeValue); +end; + procedure TXMLMember.SetName(const Value: WideString); begin - SetAttribute('Name', Value); + SetAttribute('Name', GetValidXMLText(Value)); +end; + +procedure TXMLMember.SetValue(const Value: WideString); +begin + SetNodeValue(GetValidXMLText(Value)); +end; + +function TXMLDocumentElementsEnumerator.GetCurrent: IXMLDocumentElement; +begin + Result := (inherited GetCurrent as IXMLDocumentElement); end; procedure TXMLDocumentElements.AfterConstruction; @@ -442,6 +682,11 @@ begin inherited; end; +function TXMLDocumentElements.GetEnumerator: IXMLDocumentElementsEnumerator; +begin + Result := TXMLDocumentElementsEnumerator.Create(Self); +end; + function TXMLDocumentElements.Get_DocumentElement(Index: Integer): IXMLDocumentElement; begin Result := (List[Index] as IXMLDocumentElement); @@ -457,6 +702,16 @@ begin Result := (AddItem(Index) as IXMLDocumentElement); end; +procedure TXMLDocumentElement.XSDValidate; +begin + CreateRequiredAttributes(Self, ['Schema', 'XPath']); +end; + +procedure TXMLDocumentElement.XSDValidateStrict(AResult: IXSDValidateStrictResult); +begin + ValidateRequiredAttributes(AResult, Self, ['Schema', 'XPath']); +end; + function TXMLDocumentElement.GetSchema: WideString; begin Result := AttributeNodes['Schema'].Text; @@ -469,12 +724,17 @@ end; procedure TXMLDocumentElement.SetSchema(const Value: WideString); begin - SetAttribute('Schema', Value); + SetAttribute('Schema', GetValidXMLText(Value)); end; procedure TXMLDocumentElement.SetXPath(const Value: WideString); begin - SetAttribute('XPath', Value); + SetAttribute('XPath', GetValidXMLText(Value)); +end; + +function TXMLInterfacesEnumerator.GetCurrent: IXMLInterfaceName; +begin + Result := (inherited GetCurrent as IXMLInterfaceName); end; procedure TXMLInterfaces.AfterConstruction; @@ -487,6 +747,11 @@ begin inherited; end; +function TXMLInterfaces.GetEnumerator: IXMLInterfacesEnumerator; +begin + Result := TXMLInterfacesEnumerator.Create(Self); +end; + function TXMLInterfaces.Get_InterfaceName(Index: Integer): IXMLInterfaceName; begin Result := (List[Index] as IXMLInterfaceName); @@ -502,6 +767,16 @@ begin Result := (AddItem(Index) as IXMLInterfaceName); end; +procedure TXMLInterfaceName.XSDValidate; +begin + CreateRequiredAttributes(Self, ['Schema', 'XPath']); +end; + +procedure TXMLInterfaceName.XSDValidateStrict(AResult: IXSDValidateStrictResult); +begin + ValidateRequiredAttributes(AResult, Self, ['Schema', 'XPath']); +end; + function TXMLInterfaceName.GetSchema: WideString; begin Result := AttributeNodes['Schema'].Text; @@ -512,14 +787,29 @@ begin Result := AttributeNodes['XPath'].Text; end; +function TXMLInterfaceName.GetValue: WideString; +begin + Result := VarToStr(GetNodeValue); +end; + procedure TXMLInterfaceName.SetSchema(const Value: WideString); begin - SetAttribute('Schema', Value); + SetAttribute('Schema', GetValidXMLText(Value)); end; procedure TXMLInterfaceName.SetXPath(const Value: WideString); begin - SetAttribute('XPath', Value); + SetAttribute('XPath', GetValidXMLText(Value)); +end; + +procedure TXMLInterfaceName.SetValue(const Value: WideString); +begin + SetNodeValue(GetValidXMLText(Value)); +end; + +function TXMLPropertiesEnumerator.GetCurrent: IXMLPropertyName; +begin + Result := (inherited GetCurrent as IXMLPropertyName); end; procedure TXMLProperties.AfterConstruction; @@ -532,6 +822,11 @@ begin inherited; end; +function TXMLProperties.GetEnumerator: IXMLPropertiesEnumerator; +begin + Result := TXMLPropertiesEnumerator.Create(Self); +end; + function TXMLProperties.Get_PropertyName(Index: Integer): IXMLPropertyName; begin Result := (List[Index] as IXMLPropertyName); @@ -547,6 +842,16 @@ begin Result := (AddItem(Index) as IXMLPropertyName); end; +procedure TXMLPropertyName.XSDValidate; +begin + CreateRequiredAttributes(Self, ['Schema', 'XPath']); +end; + +procedure TXMLPropertyName.XSDValidateStrict(AResult: IXSDValidateStrictResult); +begin + ValidateRequiredAttributes(AResult, Self, ['Schema', 'XPath']); +end; + function TXMLPropertyName.GetSchema: WideString; begin Result := AttributeNodes['Schema'].Text; @@ -559,12 +864,12 @@ end; procedure TXMLPropertyName.SetSchema(const Value: WideString); begin - SetAttribute('Schema', Value); + SetAttribute('Schema', GetValidXMLText(Value)); end; procedure TXMLPropertyName.SetXPath(const Value: WideString); begin - SetAttribute('XPath', Value); + SetAttribute('XPath', GetValidXMLText(Value)); end; diff --git a/Units/XMLDataBindingGenerator.pas b/Units/XMLDataBindingGenerator.pas index b6b83aa..a3a17f6 100644 --- a/Units/XMLDataBindingGenerator.pas +++ b/Units/XMLDataBindingGenerator.pas @@ -77,7 +77,7 @@ type function FindInterface(ASchema: TXMLDataBindingSchema; const AName: String; AType: TXMLDataBindingInterfaceType): TXMLDataBindingInterface; function FindEnumeration(ASchema: TXMLDataBindingSchema; const AName: String): TXMLDataBindingEnumeration; - procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); + procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); procedure ResolveSchema(ASchema: TXMLDataBindingSchema); procedure ResolveAlias(ASchema: TXMLDataBindingSchema); @@ -113,7 +113,7 @@ type private FOwner: TXMLDataBindingGenerator; protected - procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); virtual; + procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); virtual; property Owner: TXMLDataBindingGenerator read FOwner; public @@ -136,7 +136,7 @@ type function GetIncludes(Index: Integer): TXMLDataBindingSchema; function GetTargetNamespace: String; protected - procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); override; + procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); override; procedure AddInclude(ASchema: TXMLDataBindingSchema); procedure AddItem(AItem: TXMLDataBindingItem); @@ -177,12 +177,11 @@ type protected function GetItemType: TXMLDataBindingItemType; virtual; abstract; procedure SetName(const Value: String); - - property SchemaItem: IXMLSchemaItem read FSchemaItem; public constructor Create(AOwner: TXMLDataBindingGenerator; ASchemaItem: IXMLSchemaItem; const AName: String); property Schema: TXMLDataBindingSchema read FSchema write FSchema; + property SchemaItem: IXMLSchemaItem read FSchemaItem; property TargetNamespace: String read FTargetNamespace write FTargetNamespace; property DocumentElement: Boolean read FDocumentElement write FDocumentElement; @@ -211,7 +210,7 @@ type protected function GetItemType: TXMLDataBindingItemType; override; - procedure ReplaceItem(const AOldItem: TXMLDataBindingItem; const ANewItem: TXMLDataBindingItem); override; + procedure ReplaceItem(const AOldItem: TXMLDataBindingItem; const ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); override; procedure AddProperty(AProperty: TXMLDataBindingProperty); public @@ -251,9 +250,11 @@ type protected function GetItemType: TXMLDataBindingItemType; override; public - constructor Create(AOwner: TXMLDataBindingGenerator; ASchemaItem: IXMLSchemaItem; AEnumerations: IXMLEnumerationCollection; const AName: String); + constructor Create(AOwner: TXMLDataBindingGenerator; ASchemaItem: IXMLSchemaItem; AEnumerations: IXMLEnumerationCollection; const AName: String); overload; destructor Destroy; override; + procedure ReplaceMembers(AMembers: TEnumerable); + property MemberCount: Integer read GetMemberCount; property Members[Index: Integer]: TXMLDataBindingEnumerationMember read GetMembers; end; @@ -309,7 +310,7 @@ type function GetIsReadOnly: Boolean; override; function GetPropertyType: TXMLDataBindingPropertyType; override; - procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); override; + procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); override; public constructor Create(AOwner: TXMLDataBindingGenerator; ASchemaItem: IXMLSchemaItem; const AName: String; AItem: TXMLDataBindingItem); @@ -335,7 +336,7 @@ type protected function GetItemType: TXMLDataBindingItemType; override; - procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); override; + procedure ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); override; public property Item: TXMLDataBindingItem read FItem write FItem; end; @@ -1233,13 +1234,13 @@ begin end; -procedure TXMLDataBindingGenerator.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +procedure TXMLDataBindingGenerator.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); var schemaIndex: Integer; begin for schemaIndex := Pred(SchemaCount) downto 0 do - Schemas[schemaIndex].ReplaceItem(AOldItem, ANewItem); + Schemas[schemaIndex].ReplaceItem(AOldItem, ANewItem, ARemoveOnly); end; @@ -1304,7 +1305,7 @@ begin interfaceItem.BaseName := complexAliasItem.Item.Name; ASchema.AddItem(interfaceItem); - ReplaceItem(complexAliasItem, interfaceItem); + ReplaceItem(complexAliasItem, interfaceItem, True); FreeAndNil(complexAliasItem); end; end; @@ -1314,7 +1315,7 @@ begin { Remove the alias element - TXMLDataBindingInterfaceItem.ReplaceItem will take care of fixing it's properties. } simpleAliasItem := TXMLDataBindingSimpleTypeAliasItem(item); - ReplaceItem(simpleAliasItem, nil); + ReplaceItem(simpleAliasItem, nil, True); FreeAndNil(simpleAliasItem); end; end; @@ -1353,7 +1354,7 @@ begin end; if Assigned(referenceItem) then - ReplaceItem(AItem, referenceItem) + ReplaceItem(AItem, referenceItem, True) else raise EXMLDataBindingUnresolvedItem.CreateFmt('Unresolved %s: %s', [GetEnumName(TypeInfo(TXMLDataBindingInterfaceType), Ord(AItem.InterfaceType)), @@ -1639,7 +1640,7 @@ begin end; -procedure TXMLDataBindingGeneratorItem.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +procedure TXMLDataBindingGeneratorItem.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); begin end; @@ -1663,7 +1664,7 @@ begin end; -procedure TXMLDataBindingSchema.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +procedure TXMLDataBindingSchema.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); var itemIndex: Integer; @@ -1672,9 +1673,13 @@ begin for itemIndex := Pred(ItemCount) downto 0 do if Items[itemIndex] = AOldItem then - FItems.Extract(AOldItem) - else - Items[itemIndex].ReplaceItem(AOldItem, ANewItem); + begin + if ARemoveOnly then + FItems.Extract(AOldItem) + else + FItems[itemIndex] := ANewItem; + end else + Items[itemIndex].ReplaceItem(AOldItem, ANewItem, ARemoveOnly); end; @@ -1829,7 +1834,7 @@ begin end; -procedure TXMLDataBindingInterface.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +procedure TXMLDataBindingInterface.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); var propertyIndex: Integer; propertyItem: TXMLDataBindingProperty; @@ -1846,8 +1851,12 @@ begin propertyItem := Properties[propertyIndex]; if propertyItem = AOldItem then - FProperties.Extract(propertyItem) - else + begin + if ARemoveOnly then + FProperties.Extract(propertyItem) + else + FProperties[propertyIndex] := ANewItem as TXMLDataBindingProperty; + end else begin if (AOldItem.ItemType = itSimpleTypeAlias) and (propertyItem.PropertyType = ptItem) then @@ -1862,9 +1871,9 @@ begin { FProperties owns itemProperty and will free it } FProperties[propertyIndex] := simpleProperty; end else - Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem); + Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem, ARemoveOnly); end else - Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem); + Properties[propertyIndex].ReplaceItem(AOldItem, ANewItem, ARemoveOnly); end; end; end; @@ -1961,8 +1970,11 @@ begin FMembers := TObjectList.Create; - for memberIndex := 0 to Pred(AEnumerations.Count) do - FMembers.Add(TXMLDataBindingEnumerationMember.Create(Owner, Self, AEnumerations.Items[memberIndex].Value)); + if Assigned(AEnumerations) then + begin + for memberIndex := 0 to Pred(AEnumerations.Count) do + FMembers.Add(TXMLDataBindingEnumerationMember.Create(Owner, Self, AEnumerations.Items[memberIndex].Value)); + end; end; @@ -1974,6 +1986,18 @@ begin end; +procedure TXMLDataBindingEnumeration.ReplaceMembers(AMembers: TEnumerable); +var + member: TXMLDataBindingEnumerationMember; + +begin + FMembers.Clear; + + for member in AMembers do + FMembers.Add(member); +end; + + function TXMLDataBindingEnumeration.GetItemType: TXMLDataBindingItemType; begin Result := itEnumeration; @@ -2048,7 +2072,7 @@ begin end; -procedure TXMLDataBindingItemProperty.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +procedure TXMLDataBindingItemProperty.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); begin inherited; @@ -2085,7 +2109,7 @@ end; { TXMLDataBindingComplexTypeAliasItem } -procedure TXMLDataBindingComplexTypeAliasItem.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem); +procedure TXMLDataBindingComplexTypeAliasItem.ReplaceItem(const AOldItem, ANewItem: TXMLDataBindingItem; ARemoveOnly: Boolean); begin inherited; diff --git a/X2XMLDataBinding.dproj b/X2XMLDataBinding.dproj index abf50cf..cd277d4 100644 --- a/X2XMLDataBinding.dproj +++ b/X2XMLDataBinding.dproj @@ -59,6 +59,7 @@ 1033 $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + true true @@ -68,6 +69,7 @@ 1033 $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png + true 7.0 @@ -80,9 +82,14 @@ true 1033 Debug + "P:\sam\xsd\MBCPOS\masterupdatefile_v_2_7.xsd" + true Debug + true + 1033 + true Delphi.Personality.12 @@ -125,6 +132,10 @@ X2XMLDataBinding.dpr + + Microsoft Office 2000 Sample Automation Server Wrapper Components + Microsoft Office XP Sample Automation Server Wrapper Components + True diff --git a/X2XMLDataBinding.res b/X2XMLDataBinding.res index f1c0ad0..c580105 100644 Binary files a/X2XMLDataBinding.res and b/X2XMLDataBinding.res differ diff --git a/X2XMLDataBinding.stat b/X2XMLDataBinding.stat index 7b5f01a..a376760 100644 --- a/X2XMLDataBinding.stat +++ b/X2XMLDataBinding.stat @@ -1,10 +1,10 @@ [Stats] -EditorSecs=37 -DesignerSecs=5 +EditorSecs=92 +DesignerSecs=13 InspectorSecs=1 -CompileSecs=620 -OtherSecs=5 +CompileSecs=1741 +OtherSecs=40 StartTime=09/04/2020 10:52:32 RealKeys=0 EffectiveKeys=0 -DebugSecs=20 +DebugSecs=71 diff --git a/XSD/DataBindingHints.xsd b/XSD/DataBindingHints.xsd index 997687c..2e1e936 100644 --- a/XSD/DataBindingHints.xsd +++ b/XSD/DataBindingHints.xsd @@ -25,6 +25,7 @@ +