使用XML数据绑定时生成复杂类型的问题

时间:2010-10-26 14:33:10

标签: delphi delphi-2006 xml-binding

我正在使用XML数据映射,并在使用它时生成复杂类型时遇到问题。

如果我有一个类似下面的XML工作正常

<?xml version="1.0" standalone="yes" ?>
<Sample>
      <connection>
        <item  Name="ABC">123</item>
        <item  Name="XYZ">123</item>
        <item  Name="MNO">123</item>
      </connection>
      <connection>
        <item  Name="ABC">123</item>
        <item  Name="XYZ">123</item>
        <item  Name="MNO">123</item>
      </connection>
</Sample>

我的复杂类型为SampleType, ConnectionType and ItemType

但如果我有像

那样的XML
<?xml version="1.0" standalone="yes" ?>
<Sample>
      <connection>
        <item  Name="ABC"/>
        <item  Name="XYZ"/>
        <item  Name="MNO"/>
      </connection>
      <connection>
        <item  Name="ABC"/>
        <item  Name="XYZ"/>
        <item  Name="MNO"/>
      </connection>
</Sample>

我得到的复杂类型为SampleType, ConnectionType, ItemType, ItemType2, ItemType22, ItemType222, ItemType2222, and ItemType22222,即ItemTypes等于XML中存在的项目数。

为什么会这样,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

这是因为数据映射器并不是要从XML文件(或更好的措辞XML文档)推断出数据,而是来自XML Schema

XML Schema描述了XML文档应遵循的语法。

XML模式可以存储为XSD文件或DTD文件。

因此,您应该采取的第一步是创建XSD架构。 您可以从XML生成XSD开始,然后抛光XSD。

在线XML-2-XSD工具可以帮助您生成该XSD,但还有更多工具。

然后在数据映射器中使用该XSD,你就有更好的机会。

注意:XML类型的定义与大多数编程语言不同,因此您无法始终将XML数据类型映射到Delphi。你的简单案例会起作用,但只要你在XML中进行递归或null,就会变得非常毛茸茸。

编辑:为两个XML文档添加了XSD示例。

我使用了XmlForAsp to infer the XSD,所以你有一个良好的开端。

第一个和第二个XML文档的推断XSD是相同的:

<?xml version="1.0" encoding="utf-16"?>
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" version="1.0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Sample" type="SampleType" />
  <xsd:complexType name="SampleType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="connection" type="connectionType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="connectionType">
    <xsd:sequence>
      <xsd:element maxOccurs="unbounded" name="item" type="itemType" />
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="itemType">
    <xsd:attribute name="Name" type="xsd:string" />
  </xsd:complexType>
</xsd:schema>

- 的Jeroen