共用方式為


針對 GDL 剖析進行疑難排解

下列資訊涵蓋剖析 GDL 檔案時可能會遇到的一些非預期行為原因。

徵兆:您包含架構檔案,但剖析器會發出錯誤訊息,指出「找不到 'ROOT' 範本,GDL 專案將不會範本化」,並忽略架構。
解決方案:檢查是否已定義 ROOT 範本。 如果已定義這類範本,請確定#Include:schema.gdl 指示詞出現在任何實例資料之前。 否則,剖析器將會忽略架構。

徵兆:您在 GDL 檔案中定義屬性多次,我只會看到它出現在 XML 快照集一次。
解決方案:您必須為 XML 快照集中出現多次的任何屬性定義範本。 您必須定義 *Additive 指示詞。 否則,只會顯示最新的定義。

徵兆:剖析器抱怨「範本:「{template name}」 中定義的 [Production is not satisfied by actual construct.]「,而且似乎每個成員的出現次數在生產環境定義的範圍內。
解決方案:首先,使用 GDL 剖析器的 -i 選項,檢查哪些範本系結至每個 GDL 專案。 系結可能未以您預期的方式發生。 如果系結似乎正常運作,請記住,生產環境是由生產環境中名為 的範本實例,以及衍生自具名範本之任何範本的任何實例所滿足。 因此,如果生產環境指定可能只有一個特定範本的實例存在,而且實際資料檔案包含衍生自該範本之範本的兩個實例,則會違反生產環境。 即使衍生的範本重新定義 *Name 指示詞,也會追蹤範本繼承。

徵兆:您會收到一則警告訊息,該訊息會參考正在剖析的 GDL 檔案中不存在的 *InvalidCombination。
解決方案:GDL 剖析器會在內部將 *Constraint 指示詞轉換成 *InvalidCombination 指示詞。 因此,在轉換後偵測到錯誤時,訊息會將 *條件約束稱為 *InvalidCombination。 此外,*InvalidCombination 的每個元素在內部儲存的順序不一定是 GDL 檔案中指定的順序。

徵兆:當值宏參考被取代為其定義的值時,會出現假性尾端空格。
解決方案:值巨集定義包含尾端批註。 將批註移至另一行。 在大部分的內容中,剖析器不區分其他空白字元的存在。

徵兆:使用 *IgnoreBlock 建構周圍不符合的語法並不會隱藏剖析器的內容,因為仍然會產生語法錯誤。
解決方案:*IgnoreBlock 的內容仍然必須符合 GDL。 *IgnoreBlock 只會防止其內容出現在內部資料樹狀結構中,並防止執行任何非預處理器指示詞。 若要真正隱藏某些專案,請使用預處理器條件。 如果隱藏本身的片段包含不應該執行的預處理器指示詞,請在以預處理器條件括住片段之前,先變更預處理器前置詞。

徵兆:在以 *PreCompiled 指定的檔案內定義的功能、建構和屬性不會出現在 XML 快照中,而且主機檔案無法參考。
解決方案:此徵兆是由設計所發生。 您只能在先行編譯的檔案中儲存範本和巨集定義。

徵兆:您無法參考範本、預處理器定義、宏或其他從使用 *PreCompiled 指定的檔案中定義的其他內容。
解決方案:此徵兆是由設計所發生。 先行編譯的檔案是設計成獨立且完全獨立于主機檔案的內容。 若要存取另一個檔案中定義的範本或其他內容,您必須放置#Include指示詞,該指示詞會將該檔案直接命名在#PreCompiled檔案內。 透過在#Include檔案內使用#Include) (,) 的巢狀#Include語句) ,可透過根先行編譯的 (#PreCompiled) 檔案存取間接包含的內容 (。 先行編譯的檔案可以使用#Include) 其他先行編譯的檔案來包含 (。

徵兆:功能或選項不會以您定義它們的順序出現在快照集中。 或者,第一個選項未指派為預設選項。
解決方案:某些選項可能先前已定義于 GDL 檔案的另一個部分,或在您查看的功能或選項定義之前所處理的內含檔案中。 處理的第一個選項會變成第一個選項、處理的第二個選項會變成快照中的第二個選項等等。

徵兆:您收到警告訊息,指出 GDL 剖析器找不到 *ElementType 指示詞所參考但已定義該範本的範本。
解決方案:只有宣告為 *Type:DATATYPE 的範本才能由 *ElementType 指示詞參考。

徵兆:定義為 *FilterTypeName: 「CODEPAGE_STRING」 的屬性值不會正確轉換成 Unicode。
解決方案:如果在剖析此屬性時未定義 *CodePage 指示詞,剖析器會假設字串已在 Unicode 中。 請確定 *CodePage 定義出現在任何CODEPAGE_STRING屬性之前。

徵兆:您已在陣列或複合資料型別範本中定義 *RequiredDelimiter,成為多個空白字元或索引標籤的序列,而且剖析器似乎無法辨識實際資料,即使它完全符合範本定義也一樣。
解決方案:剖析器會在內部將任何任意空白字元串 (空格或定位字元) 轉換成單一空白字元。 因此,檢查值時,它不會滿足範本定義。 若要避免這種情況,請為 *RequiredDelimiter 指定一個空白字元,或使用 *RequiredDelimiter 的非空白字元,並使用 *OptionalDelimiter 的空白字元和索引標籤字元。

徵兆:DOM 介面:Xpath 查詢在快照 (中找不到任何元素,例如 selectSingleNode (「/SnapshotRoot/GDL_ATTRIBUTE」) 不會傳回任何) 。
解決方案:Xpath 假設沒有命名空間前置詞的專案名稱參考 Null 或空白命名空間,而不是預設命名空間。 快照集會定義預設命名空間,而大部分專案都屬於預設命名空間。

若要使用 Xpath 存取這些元素,用戶端必須先將此預設命名空間對應至 explict 前置詞。 若要以這種方式對應預設命名空間,請使用檔 pbjects setProperty 方法。 需要設定的屬性是 SelectionNamespaces。 使用這個屬性來指派預設命名空間的前置詞。 在快照集中,預設命名空間是此 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\"");

上述範例中的第二個引數實際上是 Variant,但為了簡單起見,省略這個新增的複雜度。 參考預設命名空間中的專案時,Xpath 查詢現在必須明確參考命名空間前置詞 gdl。 查詢接著會變成下列程式碼範例。

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

徵兆:DOM 介面:nodeTypedValue 屬性一律會以 BSTR 類型傳回值,而不論其 xsi:type 為何。
解決方案:MSXML 4.0 的目前實作只會在使用資料類型定義 (DTD) 來定義資料類型時辨識資料類型。 GDL 剖析器使用 XSD,這是目前的 W3C 建議。

徵兆:包含介於 0 和 0x19之間 ANSI 值的字元的引號字串會導致 XML 剖析錯誤 (,但除了0x0a、0x0d和0x09) 以外。
解決方案:此錯誤是 XML 功能。 這類字串必須使用 XML 的二進位或 binhex 資料格式來表示。 未來的 XML 版本可能會接受包含這些字元的字串。

徵兆:使用 PASSTHROUGH 或XSD_DEFINED資料類型所定義的某些 XML 實例資料或架構,會在載入 DOM 時造成 XML 剖析器或驗證錯誤訊息。
解決方案:使用 PASSTHROUGH 或XSD_DEFINED資料類型建立您自己的 XML 會略過 GDL 剖析器 XML 產生程式碼,並將您公開至 DOM 剖析器中 XML 和 quirks 的複雜度。 使用這些資料類型之前,您應該熟悉 XML 來處理這類問題。

徵兆:剖析器指出「前置詞不能與先行編譯檔案搭配使用」,但根檔案不包含#Precompiled 指示詞。
解決方案:#Precompiled 指示詞實際上可能位於前置詞本身。 剖析器無法區分 GDL 內容來自前置或根檔案。