3

我正在使用 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 中存在的项目数。

为什么会发生这种情况,我该如何解决这个问题?

4

1 回答 1

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 来推断 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>

——杰伦

于 2010-10-26T15:11:46.733 回答