gpt4 book ai didi

delphi - 我可以使用 xsd :complexContent with the Delphi XML Binding Wizard?

转载 作者:行者123 更新时间:2023-12-03 18:29:48 31 4
gpt4 key购买 nike

Delphi 2009 XML 数据绑定(bind)向导无法处理包含复杂内容声明(无效指针操作)的简单 XSD。

它是错误还是已知限制?

例子:

<?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="TestType">
<xsd:complexContent>
<xsd:restriction base="xsd:anyType">
<xsd:attribute name="Name" type="xsd:string"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>

</xsd:schema>

编辑:其他示例工作正常,因此看起来 complexContent 定义的一部分会导致错误。工作示例:
<xsd:complexType name="pc-Typ">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:integer"/>
</xsd:complexType>

<xsd:complexType name="myPC-Typ">
<xsd:complexContent>
<xsd:extension base="pc-Typ">
<xsd:sequence>
<xsd:element name="ram" type="xsd:integer"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>

最佳答案

Can I use xsd:complexContent with the Delphi XML Binding Wizard?



是的, xsd:complexContent可以使用。

我知道 Delphi 有它的缺陷,但我不怪 Delphi 这种模式。 XSD 是一种丰富的模式语言,Delphi 的 OO 类也是如此。两个世界的部分重叠,但有些部分不会重叠。 XML 数据绑定(bind)是将 XML 模式转换为 OO 类结构的行为,因此模式必须足够具体才能表示为类。

在这个例子中,你说的是 TestType匹配任何类型,只要它有 string名为 Name 的属性. XML 验证器可能会接受这种定义,但很难在单继承模型中定义它,因为 foo:Animal , foo:Plant , 和 foo:Mineral可能都有 Name属性。

我定义了一个名为 TestBaseType 的空 complexType并且生成的类(class)非常好。
<?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.

关于delphi - 我可以使用 xsd :complexContent with the Delphi XML Binding Wizard?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/883477/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com