【问题标题】:Can I use xsd:complexContent with the Delphi XML Binding Wizard?我可以将 xsd:complexContent 与 Delphi XML 绑定向导一起使用吗?
【发布时间】:2009-05-19 15:31:03
【问题描述】:

Delphi 2009 XML 数据绑定向导无法处理包含复杂内容声明(无效指针操作)的简单 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>

【问题讨论】:

    标签: delphi binding xsd


    【解决方案1】:

    我可以在 Delphi XML 绑定向导中使用 xsd:complexContent 吗?

    是的,xsd:complexContent 可以使用。

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

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

    我定义了一个名为 TestBaseType 的空 complexType,并且生成的类非常好。

    <?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.
    

    【讨论】:

      【解决方案2】:

      我一直在玩 D2007,但 xsd:anyType 似乎也有问题。不过,不知道有什么办法可以解决这个问题。我确实知道 Delphi 的 XML 解析功能总是存在一些小问题。直到 D7,它甚至都没有真正符合 XML 标准。所以认为这只是 Delphi 中的另一个缺陷。 在我的 Delphi 应用程序中使用 XML 时,我只是忽略了这个 XML 向导,而只是导入 MSXML 类型库,编写我自己的代码来包装 XML 文件。这需要更多时间,但它为我的代码解决了很多问题。 对于一个项目,我什至做了一些不同的事情,创建一个 .NET 模块作为 XML 文件的包装器,将此包装器作为 COM 对象导入我的 Delphi 项目中以调用它的所有功能。它更有效,也更快。

      我喜欢 Delphi,自从它取代 Turbo/Borland Pascal 以来,它一直是我作为开发语言的首选,但如今竞争(例如 .NET)变得同样强大。

      【讨论】:

        【解决方案3】:

        最好不要使用 XML 数据绑定向导。我开始使用它,但发现它非常不适合我使用的许多 XML。然后我开始直接使用 IXMLDocument 和 IXMLNode,它们稍微好一点,但由于性能和设计原因,它们仍然不是特别好。然后我切换到libxml2 并一直使用它。

        【讨论】:

          【解决方案4】:

          确认您的第一个示例在 xmllint 中解析良好。

          看到xsd:NCName 我很惊讶,因为我倾向于认为它仅供内部使用 - 但您当然可以使用它。我在想 Dephi 的实现者可能做出了同样的假设。尝试将其更改为 xsd:string,以帮助缩小范围。

          而且——当然——为什么不把它发布到官方的 Dephi 论坛呢? (我确定它存在)他们可能会修复它,或者有解决方法。


          顺便说一句:如果您将 XSD 设置为完整的架构,那么测试 XSD 会变得更容易 - 可能会更快获得答案,因为其他人不需要添加标签。

          【讨论】:

          • 按照建议更改了架构,结果相同。我也会将其发布在 QualityCentral 中。
          猜你喜欢
          • 1970-01-01
          • 2017-11-08
          • 2012-04-10
          • 2011-10-25
          • 1970-01-01
          • 2012-10-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-25
          相关资源
          最近更新 更多