Added support for changing string properties to enumerations

This commit is contained in:
Mark van Renswoude 2020-04-22 12:26:47 +02:00
parent 17043551f9
commit 3d5c2943fc
8 changed files with 490 additions and 87 deletions

View File

@ -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

View File

@ -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<TXMLDataBindingEnumerationMember>;
var
hintMemberIndex: Integer;
member: TXMLDataBindingEnumerationMember;
begin
Result := TList<TXMLDataBindingEnumerationMember>.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<TXMLDataBindingEnumerationMember>;
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;

View File

@ -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;

View File

@ -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<TXMLDataBindingEnumerationMember>);
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<TXMLDataBindingEnumerationMember>.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<TXMLDataBindingEnumerationMember>);
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;

View File

@ -59,6 +59,7 @@
<VerInfo_Locale>1033</VerInfo_Locale>
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
</PropertyGroup>
<PropertyGroup Condition="'$(Base_Win64)'!=''">
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
@ -68,6 +69,7 @@
<VerInfo_Locale>1033</VerInfo_Locale>
<UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44>
<UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150>
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2)'!=''">
<Version>7.0</Version>
@ -80,9 +82,14 @@
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<BT_BuildType>Debug</BT_BuildType>
<Debugger_RunParams>&quot;P:\sam\xsd\MBCPOS\masterupdatefile_v_2_7.xsd&quot;</Debugger_RunParams>
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
</PropertyGroup>
<PropertyGroup Condition="'$(Cfg_2_Win64)'!=''">
<BT_BuildType>Debug</BT_BuildType>
<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
<VerInfo_Locale>1033</VerInfo_Locale>
<AppEnableRuntimeThemes>true</AppEnableRuntimeThemes>
</PropertyGroup>
<ProjectExtensions>
<Borland.Personality>Delphi.Personality.12</Borland.Personality>
@ -125,6 +132,10 @@
<Source>
<Source Name="MainSource">X2XMLDataBinding.dpr</Source>
</Source>
<Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dcloffice2k250.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages>
<Excluded_Packages Name="$(BDSBIN)\dclofficexp250.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages>
</Excluded_Packages>
</Delphi.Personality>
<Platforms>
<Platform value="Win32">True</Platform>

Binary file not shown.

View File

@ -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

View File

@ -25,6 +25,7 @@
</xs:sequence>
<xs:attribute name="Schema" type="xs:string" use="required"/>
<xs:attribute name="XPath" type="xs:string" use="required"/>
<xs:attribute name="ReplaceMembers" type="xs:boolean" use="optional"/>
</xs:complexType>
</xs:element>
</xs:sequence>