次の方法で共有


GDL 解析のトラブルシューティング

ここでは、GDL ファイルの解析時に発生する可能性がある予期しない動作の原因の一部について説明します。

現象: スキーマファイルを含めているにもかかわらず、パーサーは「'ROOT' テンプレートが見つかりません。GDL エントリはテンプレート化されません」というエラーメッセージを出力してスキーマが無視される。
解決策: ROOT テンプレートが定義されているかどうかを確認します。 ROOT テンプレートが定義されている場合、インスタンス データの前に #Include: schema.gdl ディレクティブがあることを確認します。 それ以外の場合、パーサーはスキーマを無視します。

現象: GDL ファイルで属性を複数回定義しても、XML スナップショットに 1 回だけしか表示ない。
解決策: XML スナップショットに複数回出現する属性には、テンプレートを定義する必要があります。 *Additive ディレクティブを定義する必要があります。 それ以外の場合は、最新の定義のみが表示されます。

現象: パーサーは、「[テンプレートで定義されたプロダクション: "{template name}" が実際のコンストラクトで満たされていません」と言う内容の警告を出力し、各メンバーの出現回数が実稼働で定義されている範囲内にあるように見えます。
解決策: まず、GDL パーサーの -i オプションを使用して、各 GDL エントリにバインドされるテンプレートをチェックします。 バインドが予期したとおりに行われなかった可能性があります。 バインディングが正常に機能している場合、プロダクションは、そのプロダクションに名前が付けられたテンプレートのインスタンスと、その名前を持つテンプレートから派生した任意のテンプレートのインスタンスによって満たされることがあります。 そのため、プロダクションが特定のテンプレートのインスタンスが 1 つしか存在しないことを指定しており、実際のデータファイルにそのテンプレートから派生した 2 つのテンプレートのインスタンスが含まれている場合、プロダクションは違反となります。 派生テンプレートが *Name ディレクティブを再定義した場合でも、テンプレートの継承は追跡されます。

現象: 解析中の GDL ファイルに存在しない *InvalidCombination を参照する警告メッセージが表示される。
解決策: GDL パーサーは、*Constraint ディレクティブを内部的に *InvalidCombination ディレクティブに変換します。 そのため、変換後にエラーが検出された場合、メッセージは *Constraint を *InvalidCombination として参照します。 また、*InvalidCombination の各要素が内部的に格納される順序は、必ずしも GDL ファイルで指定されている順序であるとは限りません。

現象: 値マクロ参照が定義された値に置き換えられた場合、末尾に不要なスペースが表示される。
解決策: 値マクロ定義の末尾にはコメントが含まれています。 コメントを別の行に移動します。 ほとんどのコンテキストでは、パーサーは追加のスペース文字の存在に影響されません。

現象: *IgnoreBlock コンストラクトで非準拠構文を囲んでも引き続き構文エラーとなり、パーサーにコンテンツが表示されたままになる。
解決策: *IgnoreBlock の内容は引き続き GDL に準拠している必要があります。 *IgnoreBlock は、その内容が内部データツリーに表示されないようにし、非プリプロセッサディレクティブが実行されるのを防ぎます。 完全に非表示にするには、プリプロセッサの条件を使用します。 非表示になっているフラグメント自体に実行すべきでないプリプロセッサ ディレクティブが含まれている場合、プリプロセッサ条件でフラグメントを囲む直前にプリプロセッサ プレフィックスを変更します。

現象: *PreCompiled で指定されたファイル内で定義されている機能、コンストラクト、属性が XML スナップショットに表示されず、ホスト ファイルから参照できない。
解決策: この症状は設計上発生します。 プリコンパイル済みファイル内には、テンプレートとマクロ定義のみを格納できます。

現象: *PreCompiled で指定されたファイル内から、他の場所で定義されているテンプレート、プリプロセッサ定義、マクロ、またはその他のコンテンツを参照できない。
解決策: この症状は設計上発生します。 プリコンパイル済みファイルは、自己完結型であり、ホスト ファイルのコンテキストから完全に独立するように設計されています。 別のファイルで定義されているテンプレートやその他のコンテンツにアクセスするには、そのファイルを指定する #Include ディレクティブを #PreCompiled ファイル内に直接配置する必要があります。 #Include ファイル内でさらに #Include を使用して入れ子になったコンテンツは、ルート のプリコンパイル済み (#PreCompiled) ファイルからアクセスできます。 プリコンパイル済みファイルには、(#Include を使用して) 他のプリコンパイル済みファイルを含めることができます。

現象: 機能またはオプションが、定義した順序でスナップショットに表示されない。 または、最初のオプションが既定のオプションとして割り当てられていない。
解決策: 一部のオプションは、GDLファイルの別の部分で以前に定義されているものや、参照している機能またはオプション定義の前に処理されたインクルード ファイルで定義されているものがあります。 処理される最初のオプションが最初のオプションになり、処理される 2 番目のオプションがスナップショットの 2 番目のオプションになります。

現象: *ElementType ディレクティブによって参照されているテンプレートが GDL パーサーで見つからないが、そのテンプレートが定義されていることを示す警告メッセージが表示される。
解決策: *ElementType ディレクティブで参照できるのは、*Type: DATATYPE として宣言されているテンプレートだけです。

現象: *FilterTypeName: "CODEPAGE_STRING" として定義されている属性の値が Unicode に正しく変換されない。
解決策: この属性の解析時に *CodePage ディレクティブが定義されていない場合、パーサーは既に文字列が Unicode であると見なします。 CODEPAGE_STRING 属性の前に *CodePage 定義があることを確認します。

現象: 配列または複合データ型テンプレートで *RequiredDelimiter を複数の空白文字またはタブのシーケンスとして定義しており、テンプレート定義に正確に準拠しているにもかかわらず、パーサーが実際のデータを認識していないように見える。
解決策: パーサーは、任意の空白文字列 (スペースまたはタブ文字) を 1 つのスペース文字に内部的に変換します。 したがって、値のチェック時にテンプレート定義が準拠から外れます。 この状況を回避するには、*RequiredDelimiter にスペース文字を 1 つだけ指定するか、*RequiredDelimiter に空白以外の文字を使用し、*OptionalDelimiter にスペースとタブ文字を使用します。

現象: DOM インターフェイス: Xpath クエリで、スナップショット内の要素が見つからない (たとえば、selectSingleNode("/SnapshotRoot/GDL_ATTRIBUTE") が何も返さない)。
解決策: Xpath は、名前空間プレフィックスのない要素名が、既定の名前空間ではなく null または空の名前空間を参照することを前提としています。 スナップショットは既定の名前空間を定義し、ほとんどの要素は既定の名前空間に属します。

Xpath を使用してこれらの要素にアクセスするには、クライアントは最初にこの既定の名前空間を explict プレフィックスにマップする必要があります。 この方法で既定の名前空間をマップするには、document pbjects setProperty メソッドを使用します。 設定する必要があるプロパティは SelectionNamespaces です。 このプロパティを使用して、既定の名前空間に explict プレフィックスを割り当てます。 スナップショットでは、既定の名前空間は以下の URI となります:

https://schemas.microsoft.com/2002/print/gdl/1.0

setProperty の呼び出しは、次のコード例のようになります:

XMLDoc->setProperty(L"SelectionNamespaces", "xmlns:gdl=\"https://schemas.microsoft.com/2002/print/gdl/1.0\"");

前の例の 2 番目の引数は実際には Variant ですが、分かりやすくするため省略されています。 Xpath クエリでは、既定の名前空間の要素を参照するときに、名前空間プレフィックス gdl を明示的に参照する必要があります。 クエリは次のコード例のようになります。

selectSingleNode("/gdl:SnapshotRoot/gdl:GDL_ATTRIBUTE")

現象: DOM インターフェイス: nodeTypedValue プロパティが、xsi:type に関係なく、常に値が BSTR 型として返される。
解決策: MSXML 4.0 の現在の実装では、データ型定義 (DTD) を使用して定義されている場合にのみ、データ型が認識されます。 GDL パーサーは、現在の W3C 推奨事項である XSD を使用します。

現象: ANSI 値が 0 ~ 0x19の文字を含む引用符で囲まれた文字列で、XML 解析エラー (0x0a、0x0d、0x09 を除く) が発生する 。
解決策: このエラーは XML 機能です。 このような文字列は、XML のバイナリ形式または binex データ形式を使用して表す必要があります。 今後のバージョンの XML では、これらの文字を含む文字列を受け入れる可能性があります。

現象: PASSTHROUGH または XSD_DEFINED データ型を使用して定義された一部の XML インスタンス データまたはスキーマで、DOM に読み込まれると XML パーサーまたは検証エラー メッセージが発生する。
解決策: PASSTHROUGH または XSD_DEFINED データ型を使用して独自の XML を作成した場合、GDL パーサーの XML 生成コードをバイパスし、XML の複雑な構造や DOM パーサーの特性に直接対処する必要があります。 これらのデータ型を使用する場合、このような問題に対処できるだけの十分な XML の知識が必要になります。

現象: パーサーに「プリコンパイル済みファイルでプレファスを使用できません」と表示されますが、ルート ファイルに #Precompiled ディレクティブが含まれていない。
解決策: #Precompiled ディレクティブは、実際には冒頭部分自体に存在する可能性があります。 パーサーは、GDL コンテンツが冒頭部分とルート ファイルのどちらから来たのかを区別できません。