Устранение неполадок синтаксического анализа GDL
Ниже описаны некоторые причины непредвиденного поведения, которые могут возникнуть при анализе файлов GDL.
Симптом. Вы включаете файл схемы, но средство синтаксического анализа выдает сообщение об ошибке с сообщением "шаблон ROOT не найден, записи GDL не будут шаблонизированы" и игнорирует схему.
Решение. Проверьте, определен ли шаблон ROOT. Если такой шаблон определен, убедитесь, что директива #Include: schema.gdl находится перед данными экземпляра. В противном случае средство синтаксического анализа проигнорирует схему.
Симптом. Атрибут определяется несколько раз в GDL-файле, и я вижу, что он отображается в XML-snapshot только один раз.
Решение. Необходимо определить шаблон для любого атрибута, который отображается в XML-snapshot несколько раз. Необходимо определить *Аддитивную директиву. В противном случае будет отображаться только последнее определение.
Симптом. Средство синтаксического анализа жалуется на то, что "[Production defined in Template: "{имя_шаблона}" не удовлетворяется фактической конструкцией.]", и кажется, что количество вхождений каждого элемента находится в пределах, определенных рабочей средой.
Решение. Сначала проверка, какой шаблон привязан к каждой записи GDL с помощью параметра -i средства синтаксического анализа GDL. Возможно, привязка произошла не так, как вы ожидали. Если кажется, что привязка сработала, помните, что рабочая среда удовлетворяется экземпляром шаблона с именем в рабочей среде и любым экземпляром любого шаблона, производного от именованного шаблона. Таким образом, если в рабочей среде указано, что может присутствовать только один экземпляр определенного шаблона и если фактический файл данных содержит два экземпляра шаблона, производного от этого шаблона, рабочая среда будет нарушена. Наследование шаблона отслеживается, даже если производный шаблон переопределяет директиву *Name.
Симптом. Вы получаете предупреждающее сообщение со ссылкой на *InvalidCombination, которая не существует в анализируемом GDL-файле.
Решение. Средство синтаксического анализа GDL преобразует директивы *Constraint в *InvalidCombination директивы внутри. Таким образом, при обнаружении ошибок после преобразования сообщение ссылается на *Constraint как на *InvalidCombination. Кроме того, порядок, в который каждый элемент *InvalidCombination хранится внутри, не обязательно является порядком, указанным в файле GDL.
Симптом. При замене ссылки на макрос значения определенным значением появляется подмногий пробел.
Решение. Определение макроса значения содержит конечный комментарий. Переместите комментарий в отдельную строку. В большинстве контекстов средство синтаксического анализа не учитывает наличие дополнительных символов пробела.
Симптом. Если вы окружаете несоответствующий синтаксис конструкцией *IgnoreBlock, содержимое средства синтаксического анализа не скрывается, так как по-прежнему создаются синтаксические ошибки.
Решение. Содержимое *IgnoreBlock должно по-прежнему соответствовать GDL. *IgnoreBlock просто предотвратит появление содержимого во внутренних деревьях данных и запретит выполнение директив, не относящихся к препроцессору. Чтобы действительно скрыть что-то, используйте условия препроцессора. Если скрытый фрагмент содержит директивы препроцессора, которые не должны выполняться, измените префикс препроцессора непосредственно перед тем, как он будет заключен в условия препроцессора.
Симптом. Признаки, конструкции и атрибуты, определенные в файлах, которые обозначены с помощью *PreCompiled, не отображаются в XML-snapshot и не могут ссылаться в файле узла.
Решение. Этот симптом возникает по умолчанию. В предварительно скомпилированных файлах можно хранить только шаблоны и определения макросов.
Симптом. Нельзя ссылаться на шаблоны, определения препроцессора, макросы или другое содержимое, определенное в других местах в файлах, которые обозначены с помощью *PreCompiled.
Решение. Этот симптом возникает по умолчанию. Предварительно скомпилированные файлы должны быть автономными и полностью независимыми от контекста ведущего файла. Для доступа к шаблонам или другому содержимому, определенному в другом файле, необходимо поместить директиву #Include, которая присваивает имя файлу непосредственно в файле #PreCompiled. Содержимое, которое косвенно включается в результате включения (с помощью #Include) в файл #Include (т. е. вложенные операторы #Include), будет доступно корневому предварительно скомпилированным (#PreCompiled) файлу. Предварительно скомпилированные файлы могут включать (с помощью #Include) другие предварительно скомпилированные файлы.
Симптом. Признаки или параметры не отображаются в snapshot в порядке их определения. Или первый параметр не назначается в качестве параметра по умолчанию.
Решение. Некоторые параметры могли быть определены ранее в другой части GDL-файла или в включенном файле, который был обработан перед определением функции или параметра, которые вы просматриваете. Первый обработанный параметр становится первым вариантом, второй обработанный — вторым параметром в snapshot и т. д.
Симптом. Появляется предупреждающее сообщение о том, что средство синтаксического анализа GDL не может найти шаблон, на который ссылается директива *ElementType, но этот шаблон определен.
Решение. Директива *ElementType может ссылаться только на шаблоны, объявленные как *Type: DATATYPE.
Симптом. Значения атрибутов, определенных как *FilterTypeName: "CODEPAGE_STRING", преобразуются в Юникод неправильно.
Решение. Если директива *CodePage не определена во время анализа этого атрибута, средство синтаксического анализа предполагает, что строка уже находится в Юникоде. Убедитесь, что определение *CodePage отображается перед любыми атрибутами CODEPAGE_STRING.
Симптом. Вы определили *RequiredDelimiter в шаблоне типа данных массива или составного типа данных как последовательность из нескольких символов пробелов или табуляции, и средство синтаксического анализа не распознает фактические данные, даже если они полностью соответствуют определению шаблона.
Решение. Средство синтаксического анализа внутренне преобразует любую произвольную строку пробелов (пробелы или знаки табуляции) в один пробел. Поэтому при проверке значения оно не будет соответствовать определению шаблона. Чтобы избежать этой ситуации, укажите только один символ пробела для *RequiredDelimiter или используйте символ, отличный от пробелов, для *RequiredDelimiter и символы пробела и табуляции для *OptionalDelimiter.
Симптом. Интерфейс DOM: запрос Xpath не может найти элементы в snapshot (например, selectSingleNode("/SnapshotRoot/GDL_ATTRIBUTE") ничего не возвращает).
Решение. Xpath предполагает, что имена элементов без префикса пространства имен ссылаются на пустое или пустое пространство имен, а не на пространство имен по умолчанию. В snapshot определяется пространство имен по умолчанию, и большинство элементов относятся к пространству имен по умолчанию.
Чтобы получить доступ к этим элементам с помощью Xpath, клиент должен сначала сопоставить это пространство имен по умолчанию с префиксом explict. Чтобы сопоставить пространство имен по умолчанию таким образом, используйте метод document pbjects setProperty. Необходимо задать свойство SelectionNamespaces. Используйте это свойство, чтобы назначить пространству имен по умолчанию префикс explict. В snapshot пространство имен по умолчанию — это 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.
Симптом. Заключенные в кавычки строки, содержащие символы со значениями ANSI от 0 до 0x19 вызывают ошибки синтаксического анализа XML (за исключением 0x0a, 0x0d и 0x09).
Решение. Эта ошибка является функцией XML. Такие строки должны быть представлены с помощью двоичных или binhex форматов данных XML. В будущих версиях XML могут приниматься строки, содержащие эти символы.
Симптом. Некоторые данные или схемы экземпляра XML, определенные с помощью passthrough или XSD_DEFINED типов данных, вызывают сообщения об ошибках синтаксического анализа XML или проверки при загрузке в DOM.
Решение. Создание собственного XML-кода с помощью типов данных PASSTHROUGH или XSD_DEFINED обходит код создания XML средств синтаксического анализа GDL и предоставляет доступ к тонкостям XML и причуд в средстве синтаксического анализа DOM. Прежде чем использовать эти типы данных, вы должны иметь достаточный опыт работы с XML для решения таких проблем.
Симптом. Средство синтаксического анализа произнесет сообщение "Preface cannot be used with a precompiled file" (Preface cannot be used with a preface be used with a preface with a precompiled file), но корневой файл не содержит директиву #Precompiled.
Решение. Директива #Precompiled может находиться в самом предисловии. Средство синтаксического анализа не может определить, поступило ли содержимое GDL из предисловия или корневого файла.