XML Data Binding Wizard doesn't bind XSD's correctly
Simple issue, actually. Just curious if others recognize the problem and perhaps have a working solution for it...
I have a simple XSD file which I use to define a configuration file that is used by my application. I need to bind this schema to my project and this is done using the XDBW. In Delphi 2007, this wizard would just recognise an XSD as a schema and thus I would get perfect code for my schema. I recently upgraded to Delphi XE and I want to recreate this code again, just for the fun of it. I could use the old code, so no problem there. I just want to see if D-XE had added some improvements. Unfortunately, D-XE interprets the file just like any other file and generates code that would help me to create this schema from开发者_开发知识库 code. CLANK! (That's the sound of my head hitting a wall...) I don't want that! I want code to generate the XML that is described by the schema! So, is this problem familiar for other users? Any solutions yet?
One solution is to just use the D2007 source files. That's not an answer, though, since I need to do this exclusively from D-XE.
Another solution is by renaming the xsd file to an .biz extension. But this is an extremely ugly hack...
This is indeed a bug in Delphi XE. It is now in the Embarcadero bug tracking system as entry 88893
I tried importing the ASX.XSD file below in Rad Studio XE using the XML Data Binding Wizard, and it just works like you describe: it imports the XSD as if it were XML in stead of XSD.
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="asx" type="asxType" />
<xsd:complexType name="asxType">
<xsd:sequence>
<xsd:element name="title" type="xsd:string" />
<xsd:element maxOccurs="unbounded" name="entry" type="entryType" />
</xsd:sequence>
<xsd:attribute name="version" type="xsd:decimal" />
</xsd:complexType>
<xsd:complexType name="entryType">
<xsd:sequence>
<xsd:element name="title" type="xsd:string" />
<xsd:element name="ref" type="refType" />
<xsd:element name="author" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="refType">
<xsd:attribute name="href" type="xsd:string" />
</xsd:complexType>
</xsd:schema>
It gets me this unit:
{*****************************************************************************************************}
{ }
{ XML Data Binding }
{ }
{ Generated on: 10/12/2010 9:41:06 PM }
{ Generated from: C:\develop\codeplex\TFS05\bo\Native\Delphi\Apps\NederlandFM2WMP\doc\ASX.xsd }
{ Settings stored in: C:\develop\codeplex\TFS05\bo\Native\Delphi\Apps\NederlandFM2WMP\doc\ASX.xdb }
{ }
{*****************************************************************************************************}
unit ASX;
interface
uses xmldom, XMLDoc, XMLIntf;
type
{ Forward Decls }
IXMLSchemaType = interface;
IXMLElementType = interface;
IXMLComplexType = interface;
IXMLComplexTypeList = interface;
IXMLSequenceType = interface;
IXMLAttributeType = interface;
{ IXMLSchemaType }
IXMLSchemaType = interface(IXMLNode)
['{F8A90A02-2236-4A50-A278-CFBB8625B36C}']
{ Property Accessors }
function Get_AttributeFormDefault: UnicodeString;
function Get_ElementFormDefault: UnicodeString;
function Get_Version: UnicodeString;
function Get_Element: IXMLElementType;
function Get_ComplexType: IXMLComplexTypeList;
procedure Set_AttributeFormDefault(Value: UnicodeString);
procedure Set_ElementFormDefault(Value: UnicodeString);
procedure Set_Version(Value: UnicodeString);
{ Methods & Properties }
property AttributeFormDefault: UnicodeString read Get_AttributeFormDefault write Set_AttributeFormDefault;
property ElementFormDefault: UnicodeString read Get_ElementFormDefault write Set_ElementFormDefault;
property Version: UnicodeString read Get_Version write Set_Version;
property Element: IXMLElementType read Get_Element;
property ComplexType: IXMLComplexTypeList read Get_ComplexType;
end;
{ IXMLElementType }
IXMLElementType = interface(IXMLNode)
['{9AAD80FD-06BC-4F82-9321-538F05522F83}']
{ Property Accessors }
function Get_Name: UnicodeString;
function Get_Type_: UnicodeString;
function Get_MaxOccurs: UnicodeString;
procedure Set_Name(Value: UnicodeString);
procedure Set_Type_(Value: UnicodeString);
procedure Set_MaxOccurs(Value: UnicodeString);
{ Methods & Properties }
property Name: UnicodeString read Get_Name write Set_Name;
property Type_: UnicodeString read Get_Type_ write Set_Type_;
property MaxOccurs: UnicodeString read Get_MaxOccurs write Set_MaxOccurs;
end;
{ IXMLComplexType }
IXMLComplexType = interface(IXMLNode)
['{9C0618C5-D81F-4BB5-8DED-0BF9AF757ABD}']
{ Property Accessors }
function Get_Name: UnicodeString;
function Get_Sequence: IXMLSequenceType;
function Get_Attribute: IXMLAttributeType;
procedure Set_Name(Value: UnicodeString);
{ Methods & Properties }
property Name: UnicodeString read Get_Name write Set_Name;
property Sequence: IXMLSequenceType read Get_Sequence;
property Attribute: IXMLAttributeType read Get_Attribute;
end;
{ IXMLComplexTypeList }
IXMLComplexTypeList = interface(IXMLNodeCollection)
['{26C4DF98-1DCA-44C8-9D58-9BEB9348FA5B}']
{ Methods & Properties }
function Add: IXMLComplexType;
function Insert(const Index: Integer): IXMLComplexType;
function Get_Item(Index: Integer): IXMLComplexType;
property Items[Index: Integer]: IXMLComplexType read Get_Item; default;
end;
{ IXMLSequenceType }
IXMLSequenceType = interface(IXMLNodeCollection)
['{9289143E-C0E2-462E-AD77-239966EEAEEC}']
{ Property Accessors }
function Get_Element(Index: Integer): IXMLElementType;
{ Methods & Properties }
function Add: IXMLElementType;
function Insert(const Index: Integer): IXMLElementType;
property Element[Index: Integer]: IXMLElementType read Get_Element; default;
end;
{ IXMLAttributeType }
IXMLAttributeType = interface(IXMLNode)
['{409542A8-7FB2-4C90-BE41-C081A0518773}']
{ Property Accessors }
function Get_Name: UnicodeString;
function Get_Type_: UnicodeString;
procedure Set_Name(Value: UnicodeString);
procedure Set_Type_(Value: UnicodeString);
{ Methods & Properties }
property Name: UnicodeString read Get_Name write Set_Name;
property Type_: UnicodeString read Get_Type_ write Set_Type_;
end;
{ Forward Decls }
TXMLSchemaType = class;
TXMLElementType = class;
TXMLComplexType = class;
TXMLComplexTypeList = class;
TXMLSequenceType = class;
TXMLAttributeType = class;
{ TXMLSchemaType }
TXMLSchemaType = class(TXMLNode, IXMLSchemaType)
private
FComplexType: IXMLComplexTypeList;
protected
{ IXMLSchemaType }
function Get_AttributeFormDefault: UnicodeString;
function Get_ElementFormDefault: UnicodeString;
function Get_Version: UnicodeString;
function Get_Element: IXMLElementType;
function Get_ComplexType: IXMLComplexTypeList;
procedure Set_AttributeFormDefault(Value: UnicodeString);
procedure Set_ElementFormDefault(Value: UnicodeString);
procedure Set_Version(Value: UnicodeString);
public
procedure AfterConstruction; override;
end;
{ TXMLElementType }
TXMLElementType = class(TXMLNode, IXMLElementType)
protected
{ IXMLElementType }
function Get_Name: UnicodeString;
function Get_Type_: UnicodeString;
function Get_MaxOccurs: UnicodeString;
procedure Set_Name(Value: UnicodeString);
procedure Set_Type_(Value: UnicodeString);
procedure Set_MaxOccurs(Value: UnicodeString);
end;
{ TXMLComplexType }
TXMLComplexType = class(TXMLNode, IXMLComplexType)
protected
{ IXMLComplexType }
function Get_Name: UnicodeString;
function Get_Sequence: IXMLSequenceType;
function Get_Attribute: IXMLAttributeType;
procedure Set_Name(Value: UnicodeString);
public
procedure AfterConstruction; override;
end;
{ TXMLComplexTypeList }
TXMLComplexTypeList = class(TXMLNodeCollection, IXMLComplexTypeList)
protected
{ IXMLComplexTypeList }
function Add: IXMLComplexType;
function Insert(const Index: Integer): IXMLComplexType;
function Get_Item(Index: Integer): IXMLComplexType;
end;
{ TXMLSequenceType }
TXMLSequenceType = class(TXMLNodeCollection, IXMLSequenceType)
protected
{ IXMLSequenceType }
function Get_Element(Index: Integer): IXMLElementType;
function Add: IXMLElementType;
function Insert(const Index: Integer): IXMLElementType;
public
procedure AfterConstruction; override;
end;
{ TXMLAttributeType }
TXMLAttributeType = class(TXMLNode, IXMLAttributeType)
protected
{ IXMLAttributeType }
function Get_Name: UnicodeString;
function Get_Type_: UnicodeString;
procedure Set_Name(Value: UnicodeString);
procedure Set_Type_(Value: UnicodeString);
end;
{ Global Functions }
function Getschema(Doc: IXMLDocument): IXMLSchemaType;
function Loadschema(const FileName: string): IXMLSchemaType;
function Newschema: IXMLSchemaType;
const
TargetNamespace = 'http://www.w3.org/2001/XMLSchema';
implementation
{ Global Functions }
function Getschema(Doc: IXMLDocument): IXMLSchemaType;
begin
Result := Doc.GetDocBinding('schema', TXMLSchemaType, TargetNamespace) as IXMLSchemaType;
end;
function Loadschema(const FileName: string): IXMLSchemaType;
begin
Result := LoadXMLDocument(FileName).GetDocBinding('schema', TXMLSchemaType, TargetNamespace) as IXMLSchemaType;
end;
function Newschema: IXMLSchemaType;
begin
Result := NewXMLDocument.GetDocBinding('schema', TXMLSchemaType, TargetNamespace) as IXMLSchemaType;
end;
{ TXMLSchemaType }
procedure TXMLSchemaType.AfterConstruction;
begin
RegisterChildNode('element', TXMLElementType);
RegisterChildNode('complexType', TXMLComplexType);
FComplexType := CreateCollection(TXMLComplexTypeList, IXMLComplexType, 'complexType') as IXMLComplexTypeList;
inherited;
end;
function TXMLSchemaType.Get_AttributeFormDefault: UnicodeString;
begin
Result := AttributeNodes['attributeFormDefault'].Text;
end;
procedure TXMLSchemaType.Set_AttributeFormDefault(Value: UnicodeString);
begin
SetAttribute('attributeFormDefault', Value);
end;
function TXMLSchemaType.Get_ElementFormDefault: UnicodeString;
begin
Result := AttributeNodes['elementFormDefault'].Text;
end;
procedure TXMLSchemaType.Set_ElementFormDefault(Value: UnicodeString);
begin
SetAttribute('elementFormDefault', Value);
end;
function TXMLSchemaType.Get_Version: UnicodeString;
begin
Result := AttributeNodes['version'].Text;
end;
procedure TXMLSchemaType.Set_Version(Value: UnicodeString);
begin
SetAttribute('version', Value);
end;
function TXMLSchemaType.Get_Element: IXMLElementType;
begin
Result := ChildNodes['element'] as IXMLElementType;
end;
function TXMLSchemaType.Get_ComplexType: IXMLComplexTypeList;
begin
Result := FComplexType;
end;
{ TXMLElementType }
function TXMLElementType.Get_Name: UnicodeString;
begin
Result := AttributeNodes['name'].Text;
end;
procedure TXMLElementType.Set_Name(Value: UnicodeString);
begin
SetAttribute('name', Value);
end;
function TXMLElementType.Get_Type_: UnicodeString;
begin
Result := AttributeNodes['type'].Text;
end;
procedure TXMLElementType.Set_Type_(Value: UnicodeString);
begin
SetAttribute('type', Value);
end;
function TXMLElementType.Get_MaxOccurs: UnicodeString;
begin
Result := AttributeNodes['maxOccurs'].Text;
end;
procedure TXMLElementType.Set_MaxOccurs(Value: UnicodeString);
begin
SetAttribute('maxOccurs', Value);
end;
{ TXMLComplexType }
procedure TXMLComplexType.AfterConstruction;
begin
RegisterChildNode('sequence', TXMLSequenceType);
RegisterChildNode('attribute', TXMLAttributeType);
inherited;
end;
function TXMLComplexType.Get_Name: UnicodeString;
begin
Result := AttributeNodes['name'].Text;
end;
procedure TXMLComplexType.Set_Name(Value: UnicodeString);
begin
SetAttribute('name', Value);
end;
function TXMLComplexType.Get_Sequence: IXMLSequenceType;
begin
Result := ChildNodes['sequence'] as IXMLSequenceType;
end;
function TXMLComplexType.Get_Attribute: IXMLAttributeType;
begin
Result := ChildNodes['attribute'] as IXMLAttributeType;
end;
{ TXMLComplexTypeList }
function TXMLComplexTypeList.Add: IXMLComplexType;
begin
Result := AddItem(-1) as IXMLComplexType;
end;
function TXMLComplexTypeList.Insert(const Index: Integer): IXMLComplexType;
begin
Result := AddItem(Index) as IXMLComplexType;
end;
function TXMLComplexTypeList.Get_Item(Index: Integer): IXMLComplexType;
begin
Result := List[Index] as IXMLComplexType;
end;
{ TXMLSequenceType }
procedure TXMLSequenceType.AfterConstruction;
begin
RegisterChildNode('element', TXMLElementType);
ItemTag := 'element';
ItemInterface := IXMLElementType;
inherited;
end;
function TXMLSequenceType.Get_Element(Index: Integer): IXMLElementType;
begin
Result := List[Index] as IXMLElementType;
end;
function TXMLSequenceType.Add: IXMLElementType;
begin
Result := AddItem(-1) as IXMLElementType;
end;
function TXMLSequenceType.Insert(const Index: Integer): IXMLElementType;
begin
Result := AddItem(Index) as IXMLElementType;
end;
{ TXMLAttributeType }
function TXMLAttributeType.Get_Name: UnicodeString;
begin
Result := AttributeNodes['name'].Text;
end;
procedure TXMLAttributeType.Set_Name(Value: UnicodeString);
begin
SetAttribute('name', Value);
end;
function TXMLAttributeType.Get_Type_: UnicodeString;
begin
Result := AttributeNodes['type'].Text;
end;
procedure TXMLAttributeType.Set_Type_(Value: UnicodeString);
begin
SetAttribute('type', Value);
end;
end.
But when using the .BIZ extension, it generates the correct unit:
{*****************************************************************************************************}
{ }
{ XML Data Binding }
{ }
{ Generated on: 10/12/2010 9:47:29 PM }
{ Generated from: C:\develop\codeplex\TFS05\bo\Native\Delphi\Apps\NederlandFM2WMP\doc\ASX.biz }
{ Settings stored in: C:\develop\codeplex\TFS05\bo\Native\Delphi\Apps\NederlandFM2WMP\doc\ASX.xdb }
{ }
{*****************************************************************************************************}
unit ASXUnit;
interface
uses xmldom, XMLDoc, XMLIntf;
type
{ Forward Decls }
IXMLAsxType = interface;
IXMLEntryType = interface;
IXMLEntryTypeList = interface;
IXMLRefType = interface;
{ IXMLAsxType }
IXMLAsxType = interface(IXMLNode)
['{491F413D-0118-47A0-A00E-1BB7FCAD96C2}']
{ Property Accessors }
function Get_Version: UnicodeString;
function Get_Title: UnicodeString;
function Get_Entry: IXMLEntryTypeList;
procedure Set_Version(Value: UnicodeString);
procedure Set_Title(Value: UnicodeString);
{ Methods & Properties }
property Version: UnicodeString read Get_Version write Set_Version;
property Title: UnicodeString read Get_Title write Set_Title;
property Entry: IXMLEntryTypeList read Get_Entry;
end;
{ IXMLEntryType }
IXMLEntryType = interface(IXMLNode)
['{E1F7A8DC-0893-4853-BFFD-19D22AF3313C}']
{ Property Accessors }
function Get_Title: UnicodeString;
function Get_Ref: IXMLRefType;
function Get_Author: UnicodeString;
procedure Set_Title(Value: UnicodeString);
procedure Set_Author(Value: UnicodeString);
{ Methods & Properties }
property Title: UnicodeString read Get_Title write Set_Title;
property Ref: IXMLRefType read Get_Ref;
property Author: UnicodeString read Get_Author write Set_Author;
end;
{ IXMLEntryTypeList }
IXMLEntryTypeList = interface(IXMLNodeCollection)
['{4CA3727D-89DA-4498-B617-48D413D63887}']
{ Methods & Properties }
function Add: IXMLEntryType;
function Insert(const Index: Integer): IXMLEntryType;
function Get_Item(Index: Integer): IXMLEntryType;
property Items[Index: Integer]: IXMLEntryType read Get_Item; default;
end;
{ IXMLRefType }
IXMLRefType = interface(IXMLNode)
['{0860418C-E35A-4315-8B1C-7C0D19C45740}']
{ Property Accessors }
function Get_Href: UnicodeString;
procedure Set_Href(Value: UnicodeString);
{ Methods & Properties }
property Href: UnicodeString read Get_Href write Set_Href;
end;
{ Forward Decls }
TXMLAsxType = class;
TXMLEntryType = class;
TXMLEntryTypeList = class;
TXMLRefType = class;
{ TXMLAsxType }
TXMLAsxType = class(TXMLNode, IXMLAsxType)
private
FEntry: IXMLEntryTypeList;
protected
{ IXMLAsxType }
function Get_Version: UnicodeString;
function Get_Title: UnicodeString;
function Get_Entry: IXMLEntryTypeList;
procedure Set_Version(Value: UnicodeString);
procedure Set_Title(Value: UnicodeString);
public
procedure AfterConstruction; override;
end;
{ TXMLEntryType }
TXMLEntryType = class(TXMLNode, IXMLEntryType)
protected
{ IXMLEntryType }
function Get_Title: UnicodeString;
function Get_Ref: IXMLRefType;
function Get_Author: UnicodeString;
procedure Set_Title(Value: UnicodeString);
procedure Set_Author(Value: UnicodeString);
public
procedure AfterConstruction; override;
end;
{ TXMLEntryTypeList }
TXMLEntryTypeList = class(TXMLNodeCollection, IXMLEntryTypeList)
protected
{ IXMLEntryTypeList }
function Add: IXMLEntryType;
function Insert(const Index: Integer): IXMLEntryType;
function Get_Item(Index: Integer): IXMLEntryType;
end;
{ TXMLRefType }
TXMLRefType = class(TXMLNode, IXMLRefType)
protected
{ IXMLRefType }
function Get_Href: UnicodeString;
procedure Set_Href(Value: UnicodeString);
end;
{ Global Functions }
function Getasx(Doc: IXMLDocument): IXMLAsxType;
function Loadasx(const FileName: string): IXMLAsxType;
function Newasx: IXMLAsxType;
const
TargetNamespace = '';
implementation
{ Global Functions }
function Getasx(Doc: IXMLDocument): IXMLAsxType;
begin
Result := Doc.GetDocBinding('asx', TXMLAsxType, TargetNamespace) as IXMLAsxType;
end;
function Loadasx(const FileName: string): IXMLAsxType;
begin
Result := LoadXMLDocument(FileName).GetDocBinding('asx', TXMLAsxType, TargetNamespace) as IXMLAsxType;
end;
function Newasx: IXMLAsxType;
begin
Result := NewXMLDocument.GetDocBinding('asx', TXMLAsxType, TargetNamespace) as IXMLAsxType;
end;
{ TXMLAsxType }
procedure TXMLAsxType.AfterConstruction;
begin
RegisterChildNode('entry', TXMLEntryType);
FEntry := CreateCollection(TXMLEntryTypeList, IXMLEntryType, 'entry') as IXMLEntryTypeList;
inherited;
end;
function TXMLAsxType.Get_Version: UnicodeString;
begin
Result := AttributeNodes['version'].Text;
end;
procedure TXMLAsxType.Set_Version(Value: UnicodeString);
begin
SetAttribute('version', Value);
end;
function TXMLAsxType.Get_Title: UnicodeString;
begin
Result := ChildNodes['title'].Text;
end;
procedure TXMLAsxType.Set_Title(Value: UnicodeString);
begin
ChildNodes['title'].NodeValue := Value;
end;
function TXMLAsxType.Get_Entry: IXMLEntryTypeList;
begin
Result := FEntry;
end;
{ TXMLEntryType }
procedure TXMLEntryType.AfterConstruction;
begin
RegisterChildNode('ref', TXMLRefType);
inherited;
end;
function TXMLEntryType.Get_Title: UnicodeString;
begin
Result := ChildNodes['title'].Text;
end;
procedure TXMLEntryType.Set_Title(Value: UnicodeString);
begin
ChildNodes['title'].NodeValue := Value;
end;
function TXMLEntryType.Get_Ref: IXMLRefType;
begin
Result := ChildNodes['ref'] as IXMLRefType;
end;
function TXMLEntryType.Get_Author: UnicodeString;
begin
Result := ChildNodes['author'].Text;
end;
procedure TXMLEntryType.Set_Author(Value: UnicodeString);
begin
ChildNodes['author'].NodeValue := Value;
end;
{ TXMLEntryTypeList }
function TXMLEntryTypeList.Add: IXMLEntryType;
begin
Result := AddItem(-1) as IXMLEntryType;
end;
function TXMLEntryTypeList.Insert(const Index: Integer): IXMLEntryType;
begin
Result := AddItem(Index) as IXMLEntryType;
end;
function TXMLEntryTypeList.Get_Item(Index: Integer): IXMLEntryType;
begin
Result := List[Index] as IXMLEntryType;
end;
{ TXMLRefType }
function TXMLRefType.Get_Href: UnicodeString;
begin
Result := AttributeNodes['href'].Text;
end;
procedure TXMLRefType.Set_Href(Value: UnicodeString);
begin
SetAttribute('href', Value);
end;
end.
Bug: Will QC this soon.
精彩评论