代码之家  ›  专栏  ›  技术社区  ›  Bharat

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

  •  3
  • Bharat  · 技术社区  · 14 年前

    我使用的是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 也就是说,itemtype等于XML中存在的项数。

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

    1 回复  |  直到 14 年前
        1
  •  2
  •   Jeroen Wiert Pluimers    14 年前

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

    XML模式描述XML文档应遵循的语法。

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

    因此,您应该采取的第一步是创建一个XSD模式。 您可以从XML生成一个XSD,然后抛光该XSD。

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

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

    注意:XML类型的定义与大多数编程语言不同,因此您不能总是将XML数据类型映射到Delphi。您的简单案例将起作用,但一旦您在XML中执行递归或空操作,它就会变得非常复杂。

    编辑 :为两个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>
    

    --杰罗恩

    推荐文章