データパケットへの XML ドキュメントの変換
データベース アプリケーションでの 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);
}
}
}
}