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

发布于 2024-09-29 07:38:30 字数 1256 浏览 9 评论 0原文

我正在使用 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 和 ItemType

但是,如果我有像 SampleType、ConnectionType、ItemType、ItemType2、ItemType22、ItemType222、ItemType2222 和 ItemType22222 这样的复杂类型的 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>

,即 ItemType 等于 XML 中存在的项目数。

为什么会发生这种情况以及如何解决这个问题?

I am using XML Data Mapping and having a problem with generating complex types while using it.

If i am having an XML like below its working fine

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

I am getting complex types as SampleType, ConnectionType and ItemType.

But if i have the XML like

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

I am getting complex types as SampleType, ConnectionType, ItemType, ItemType2, ItemType22, ItemType222, ItemType2222, and ItemType22222 i.e., ItemTypes were equal to number of items present in the XML.

Why this is happening and how can i solve this problem?.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

孤独岁月 2024-10-06 07:38:30

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

XML 模式描述了 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>

--jeroen

It is because the data mapper is not meant to infer data from an XML file (or better phrased XML document), but from an XML Schema.

An XML Schema describes the syntax an XML document should adhere to.

XML schema's can for instance be stored as XSD files, or DTD files.

So the first step you should take is to create an XSD schema.
You could start with generating an XSD from the XML, then polishing that XSD.

The online XML-2-XSD tool can help you with generating that XSD, but there are many more tools.

Then use that XSD in the data mapper, and you make a much better chance.

Note: XML types are defined differently than most programming languages, so you cannot always map your XML data types to Delphi. Your simple case will work, but as soon as you do recursion or null in XML, it can get pretty hairy.

Edit: added XSD sample for both XML documents.

I used XmlForAsp to infer the XSD so you have a head start.

The inferred XSD for both the first and second XML document is the same:

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文