Могу ли я использовать xsd: complexContent с Мастером привязки Delphi XML?
Да, xsd:complexContent
можно использовать.
Я знаю, что у Delphi есть свои недостатки, но я не виню Delphi за эту схему. XSD - это богатый язык схем, как и класс OO Delphi. Части двух миров пересекаются, но есть части, которые не будут. Привязка данных XML - это процесс преобразования схемы XML в структуру классов OO, поэтому схема должна быть достаточно конкретной, чтобы быть выраженной в виде класса.
В этом примере вы говорите, что TestType
соответствует любому типу, если у него есть атрибут string
с именем Name
. Валидатор XML может подойти для такого определения, но его трудно определить в модели с одним наследованием, поскольку foo:Animal
, foo:Plant
и foo:Mineral
могут иметь атрибут Name
.
Я определил пустой complexType с именем TestBaseType
, и этот класс сгенерирован совершенно нормально.
<?xml version="1.0" encoding="utf-8"?>
<xsd:schema targetNamespace="http://example.org/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:complexType name="TestBaseType">
<xsd:sequence>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="TestType">
<xsd:complexContent>
<xsd:restriction base="TestBaseType">
<xsd:attribute name="Name" type="xsd:string"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
Это сгенерировало следующий код:
unit test;
interface
uses xmldom, XMLDoc, XMLIntf;
type
{ Forward Decls }
IXMLTestBaseType = interface;
IXMLTestType = interface;
{ IXMLTestBaseType }
IXMLTestBaseType = interface(IXMLNode)
['{0FBC1D84-DA5E-4315-83A9-B5FFE9528969}']
end;
{ IXMLTestType }
IXMLTestType = interface(IXMLTestBaseType)
['{12E35067-516F-4457-8C62-4131CA60D706}']
{ Property Accessors }
function Get_Name: WideString;
procedure Set_Name(Value: WideString);
{ Methods & Properties }
property Name: WideString read Get_Name write Set_Name;
end;
{ Forward Decls }
TXMLTestBaseType = class;
TXMLTestType = class;
{ TXMLTestBaseType }
TXMLTestBaseType = class(TXMLNode, IXMLTestBaseType)
protected
{ IXMLTestBaseType }
end;
{ TXMLTestType }
TXMLTestType = class(TXMLTestBaseType, IXMLTestType)
protected
{ IXMLTestType }
function Get_Name: WideString;
procedure Set_Name(Value: WideString);
end;
implementation
{ TXMLTestBaseType }
{ TXMLTestType }
function TXMLTestType.Get_Name: WideString;
begin
Result := AttributeNodes['Name'].Text;
end;
procedure TXMLTestType.Set_Name(Value: WideString);
begin
SetAttribute('Name', Value);
end;
end.