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 スキーマからデータを推測するためです。

XML スキーマは、XML ドキュメントが準拠する必要がある構文を記述します。

たとえば、XML スキーマは XSD ファイルまたは DTD ファイルとして保存できます。

したがって、最初に行うべきステップは、XSD スキーマを作成することです。XML から XSD を生成することから始めて、その XSD を洗練することができます。

オンラインのXML-2-XSDツールがその XSD の生成に役立ちますが、他にも多くのツールがあります。

次に、その XSD をデータ マッパーで使用すると、可能性が大幅に高まります。

注: XML 型はほとんどのプログラミング言語とは異なる方法で定義されるため、XML データ型を常に Delphi にマップできるとは限りません。あなたの単純なケースは機能しますが、XML で再帰または null を実行するとすぐに、非常に複雑になる可能性があります。

編集:両方の XML ドキュメントの XSD サンプルを追加しました。

XmlForAspを使用して XSD を推測したので、有利なスタートを切ることができました。

1 番目と 2 番目の両方の 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

于 2010-10-26T15:11:46.733 に答える