Delphi 2009 XML数据绑定向导无法处理包含complexContent声明(无效指针操作)的简单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>
答案 0 :(得分:2)
我可以在Delphi XML Binding Wizard中使用xsd:complexContent吗?
是的,可以使用xsd:complexContent
。
我知道Delphi有它的缺点,但我不会责怪Delphi这个架构。 XSD是一种丰富的模式语言,Delphi的OO类也是如此。两个世界的部分重叠,但有些部分不会。 XML数据绑定是将XML模式转换为OO类结构的行为,因此模式必须具体到足以表示为类。
在此示例中,您说TestType
匹配任何类型,只要它具有名为string
的{{1}}属性即可。对于那种定义,XML验证器可能没问题,但是在单继承模型中很难定义,因为Name
,foo:Animal
和foo:Plant
可能都有{{1}属性。
我定义了一个名为foo:Mineral
的空complexType,它完全可以生成类。
Name
这产生了以下代码:
TestBaseType
答案 1 :(得分:1)
我一直在玩D2007,它似乎也遇到了xsd:anyType的问题。但是,不知道这个问题的任何解决方案。我知道Delphi在XML解析功能方面总是遇到小问题。直到D7,它甚至都不符合XML标准。所以认为它只是Delphi的另一个缺陷。 在我的Delphi应用程序中使用XML时,我只是忽略了这个XML向导而只是导入MSXML类型库,编写我自己的代码来包装XML文件。它需要更多的时间,但它解决了我的代码的许多问题。 对于一个项目,我甚至做了一些不同的事情,创建一个.NET模块作为XML文件的包装,在我的Delphi项目中将这个包装器作为COM对象导入以调用它的所有功能。它也更有效,也更快。
我喜欢Delphi,自从它取代Turbo / Borland Pascal之后,它一直是我的首选开发语言,但现在竞争(例如.NET)已经变得同样强大。
答案 2 :(得分:1)
您最好甚至不使用XML数据绑定向导。我开始使用它,但发现它非常不适合我使用的许多XML。然后我开始直接使用IXMLDocument和IXMLNode,它们有点好,但仍然不是特别好的性能和设计原因。然后我切换到libxml2并一直使用它。
答案 3 :(得分:0)
确认你的第一个例子在xmllint中解析得很好。
我很惊讶地看到xsd:NCName
,因为我倾向于认为它仅供内部使用 - 但当然你可以使用它。我认为Dephi实现者可能做出了同样的假设。尝试将其更改为xsd:string
,以帮助缩小范围。
而且 - 当然 - 为什么不将这个发布到正式的Dephi论坛? (我确定它存在)他们可能会修复它,或者有一个解决方法。