データパケットへの XML ドキュメントの変換

提供: RAD Studio
移動先: 案内検索

データベース アプリケーションでの XML の使用:インデックス への移動

XML ドキュメントをデータパケットに変換する方法を記述した変換ファイルを作成した後,変換で使用されるスキーマに準拠する XML ドキュメント用のデータパケットを作成できます。その後,これらのデータパケットをクライアントデータセットに割り当てて,ファイルに保存し,ファイルベースのデータベースアプリケーションの基本とします。

Xml.XmlTransform.TXMLTransform コンポーネントは,変換ファイルに記述されたマッピングにしたがって,XML ドキュメントをデータパケットに変換します。

メモ:  また TXMLTransform を使用して,XML 形式で表示されるデータパケットを任意の XML ドキュメントに変換することもできます。

ソース XML ドキュメントを指定する

ソース XML ドキュメントを指定する方法は 3 とおりあります。

  • ソースドキュメントがディスク上の .xml ファイルであれば,SourceXmlFile プロパティを使用できます。
  • ソースドキュメントが XML のメモリ内文字列であれば,SourceXml プロパティを使用できます。
  • ソースドキュメントの IDOMDocument インターフェースがある場合は,SourceXmlDocument プロパティを使用できます。

TXMLTransform では,上記の順序でこれらのプロパティをチェックします。つまり,まず SourceXmlFile プロパティ内のファイル名をチェックします。SourceXmlFile が空文字列である場合にのみ,SourceXml プロパティをチェックします。SourceXml が空文字列である場合にのみ,SourceXmlDocument プロパティをチェックします。

変換を指定する

XML ドキュメントをデータパケットに変換する変換を指定する方法は 2 とおりあります。

  • TransformationFile プロパティの設定で,xmlmapper.exe を使って作成された変換ファイルを示す
  • 変換用の IDOMDocument インターフェースがある場合は,TransformationDocument プロパティを設定する

TXMLTransform では,上記の順序でこれらのプロパティをチェックします。つまり,まず TransformationFile プロパティ内のファイル名をチェックします。TransformationFile が空文字列である場合にのみ,TransformationDocument プロパティをチェックします。

結果のデータパケットを取得する

TXMLTransform で変換を実行し,データパケットを生成するには,Data プロパティを読み込むだけでかまいません。たとえば,次のコードでは,XML ドキュメントと変換ファイルを使用して,データパケットを生成します。その後,クライアントデータセットに割り当てます。



 XMLTransform1.SourceXMLFile := 'CustomerDocument.xml';
 XMLTransform1.TransformationFile := 'CustXMLToCustTable.xtr';
 ClientDataSet1.XMLData := XMLTransform1.Data;



 XMLTransform1->SourceXMLFile = "CustomerDocument.xml";
 XMLTransform1->TransformationFile = "CustXMLToCustTable.xtr";
 ClientDataSet1->XMLData = XMLTransform1->Data;



ユーザー定義ノードを変換する

xmlmapper.exe を使って変換を定義するときに,XML ドキュメント内のノードの一部が「ユーザー定義」になるように指定できます。ユーザー定義ノードは,ノード値から項目値への直接的な変換に依存しない,コードで変換を行うノードです。

Xmlxform.OnTranslate イベントを使ってユーザー定義ノードを変換するコードを作成できます。OnTranslate イベントハンドラは,TXMLTransform コンポーネントで XML ドキュメント内のユーザー定義ノードを見つけるたびに呼び出されます。OnTranslate イベントハンドラでは,ソースドキュメントを読み込んで,データパケット内の項目に対する結果の値を指定できます。

たとえば次の OnTranslate イベントハンドラは,XML ドキュメント内のノードを次の形式で

<FullName>
   <Title> </Title>
   <FirstName> </FirstName>
   <LastName> </LastName>
</FullName>

1 つの項目値に変換します。



 procedure TForm1.XMLTransform1Translate(Sender: TObject; Id: String; SrcNode: IDOMNode;
   var Value: String; DestNode: IDOMNode);
 var
   CurNode: IDOMNode;
 begin
   if Id = 'FullName' then
   begin
     Value = '';
     if SrcNode.hasChildNodes then
     begin
       CurNode := SrcNode.firstChild;
       Value := Value + CurNode.nodeValue;
       while CurNode <> SrcNode.lastChild do
       begin
         CurNode := CurNode.nextSibling;
         Value := Value + ' ';
         Value := Value + CurNode.nodeValue;
       end;
     end;
   end;
 end;



 void __fastcall TForm1::XMLTransform1Translate(TObject *Sender, AnsiString Id,
 _di_IDOMNode SrcNode, AnsiString &Value, _di_IDOMNode DestNode)
 {
   if (Id == "FullName")
   {
     Value = "";
     if (SrcNode.hasChildNodes)
     {
       _di_IXMLDOMNode CurNode = SrcNode.firstChild;
       Value = SrcValue + AnsiString(CurNode.nodeValue);
       while (CurNode != SrcNode.lastChild)
       {
         CurNode = CurNode.nextSibling;
         Value = Value + AnsiString(" ");
         Value = Value + AnsiString(CurNode.nodeValue);
       }
     }
   }
 }



関連項目