我可以在Delphi XML Binding Wizard中使用xsd:complexContent吗?

时间:2009-05-19 15:31:04

标签: delphi binding xsd

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>

4 个答案:

答案 0 :(得分:2)

  
    

我可以在Delphi XML Binding Wizard中使用xsd:complexContent吗?

  

是的,可以使用xsd:complexContent

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

在此示例中,您说TestType匹配任何类型,只要它具有名为string的{​​{1}}属性即可。对于那种定义,XML验证器可能没问题,但是在单继承模型中很难定义,因为Namefoo:Animalfoo: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论坛? (我确定它存在)他们可能会修复它,或者有一个解决方法。


BTW:如果你把它变成一个完整的架构,它可以更容易地测试XSD - 然后获得答案可能会更快,因为其他人不需要添加标签。

相关问题