データ パケットへの 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 ドキュメント内のノードの一部は「ユーザー定義」となるよう指定することができます。ユーザー定義ノードとは、ノード値からフィールド値への直接的な変換に依存しない、コードでの変換を提供したいノードです。
Xml.XmlTransform.TXMLTransform.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);
}
}
}
}