Compartir a través de


Solución de problemas de análisis de GDL

En la siguiente información se describen algunas de las causas de comportamientos inesperados que puede encontrar al analizar archivos GDL.

Síntoma: se incluye el archivo de esquema, pero el analizador emite un mensaje de error que indica que no se encontró ninguna plantilla "ROOT", las entradas de GDL no se incluirán en plantillas" y omite el esquema.
Solución: compruebe si se ha definido una plantilla ROOT. Si se define una plantilla de este tipo, asegúrese de que la directiva #Include: schema.gdl viene antes de cualquier dato de instancia. De lo contrario, el analizador omitirá el esquema.

Síntoma: Se define un atributo varias veces en el archivo GDL y veo que aparece en la instantánea XML solo una vez.
Solución: debe definir una plantilla para cualquier atributo que aparezca en la instantánea XML varias veces. Debe definir la directiva *Additive. De lo contrario, solo aparecerá la definición más reciente.

Síntoma: el analizador se queja de que "[Producción definida en plantilla: "{nombre de plantilla}" no está satisfecho por la construcción real.]", y parece que el número de repeticiones de cada miembro está dentro de los límites que define la producción.
Solución: en primer lugar, compruebe qué plantilla está enlazada a cada entrada de GDL mediante la opción -i del analizador de GDL. Es posible que el enlace no se haya producido de la manera prevista. Si parece que el enlace ha funcionado, recuerde que una instancia de la plantilla denominada en producción satisface la producción y que cualquier instancia de cualquier plantilla derivada de la plantilla con nombre se cumpla. Por lo tanto, si la producción especifica que solo una instancia de una plantilla determinada podría estar presente y si el archivo de datos real contiene dos instancias de una plantilla derivada de esa plantilla, se infringirá la producción. Se realiza un seguimiento de la herencia de la plantilla aunque la plantilla derivada vuelva a definir la directiva *Name.

Síntoma: recibe un mensaje de advertencia que hace referencia a una *InvalidCombination que no existe en el archivo GDL que se está a analizar.
Solución: el analizador de GDL convierte las directivas *Constraint en *Directivas InvalidCombination internamente. Por lo tanto, cuando se detectan errores después de la conversión, el mensaje hace referencia a la *Restricción como *InvalidCombination. Además, el orden en que cada elemento de una *InvalidCombination se almacena internamente no es necesariamente el orden especificado en el archivo GDL.

Síntoma: el espacio final falso aparece cuando se reemplaza una referencia de macro de valor por su valor definido.
Solución: la definición de macro de valor contiene un comentario final. Mueva el comentario a una línea independiente. En la mayoría de los contextos, el analizador no distingue la presencia de caracteres de espacio adicionales.

Síntoma: la sintaxis que rodea la sintaxis no conforme con una construcción *IgnoreBlock no oculta el contenido del analizador a medida que se siguen generando errores de sintaxis.
Solución: el contenido de *IgnoreBlock debe seguir siendo conforme a GDL. *IgnoreBlock solo impedirá que su contenido aparezca en los árboles de datos internos y evitará que se ejecuten las directivas de no preprocesador. Para ocultar realmente algo, use condicionales de preprocesador. Si el fragmento que se oculta contiene directivas de preprocesador que no se deben ejecutar, cambie el prefijo del preprocesador justo antes de incluir el fragmento con condicionales de preprocesador.

Síntoma: las características, las construcciones y los atributos definidos dentro de los archivos designados con *Precompilados no aparecen en la instantánea XML y no se puede hacer referencia a ellos por el archivo host.
Solución: este síntoma se produce por diseño. Solo puede almacenar plantillas y definiciones de macros en archivos precompilados.

Síntoma: no se pueden hacer referencia a plantillas, preprocesadores, definiciones, macros u otro contenido definido en otro lugar de los archivos designados con *Precompilado.
Solución: este síntoma se produce por diseño. Los archivos precompilados están diseñados para ser independientes e independientes del contexto del archivo host. Para tener acceso a plantillas u otro contenido definido en otro archivo, debe colocar una directiva de #Include que asigne nombres a ese archivo directamente dentro del archivo #PreCompiled. El contenido que se incluye indirectamente en virtud de incluirse (mediante #Include) dentro del archivo #Include (es decir, instrucciones #Include anidadas) será accesible por el archivo raíz precompilado (#PreCompiled). Los archivos precompilados pueden incluir (mediante #Include) otros archivos precompilados.

Síntoma: las características o opciones no aparecen en la instantánea en el orden en que las definió. O bien, la primera opción no se asigna como opción predeterminada.
Solución: es posible que algunas opciones se hayan definido anteriormente en otra parte del archivo GDL o en un archivo incluido que se procesó antes de la definición de característica o opción que está examinando. La primera opción que se procesa se convierte en la primera opción, la segunda opción que se procesa se convierte en la segunda opción de la instantánea, etc.

Síntoma: recibe un mensaje de advertencia que indica que el analizador de GDL no encuentra una plantilla a la que hace referencia la directiva *ElementType, pero esa plantilla está definida.
Solución: solo se puede hacer referencia a las plantillas declaradas como *Type: DATATYPE mediante la directiva *ElementType.

Síntoma: los valores de los atributos que se definen como *FilterTypeName: "CODEPAGE_STRING" no se convierten en Unicode correctamente.
Solución: si la directiva *CodePage no está definida en el momento en que se analiza este atributo, el analizador asume que la cadena ya está en Unicode. Asegúrese de que la definición *CodePage aparece antes de cualquier atributo CODEPAGE_STRING.

Síntoma: ha definido el *RequiredDelimiter en la plantilla de tipo de datos compuesto o matriz para que sea una secuencia de varios caracteres de espacio o pestañas, y el analizador no parece reconocer los datos reales aunque se ajuste exactamente a la definición de la plantilla.
Solución: el analizador convierte internamente cualquier cadena arbitraria de espacio en blanco (espacio o caracteres de tabulación) en un solo carácter de espacio. Por lo tanto, cuando se activa el valor, no cumplirá la definición de plantilla. Para evitar esta situación, especifique solo un carácter de espacio para el *RequiredDelimiter, o use un carácter de espacio en blanco para *RequiredDelimiter y use los caracteres de espacio y tabulación para el *OptionalDelimiter.

Síntoma: interfaz DOM: la consulta Xpath no puede encontrar ningún elemento en la instantánea (por ejemplo, selectSingleNode("/SnapshotRoot/GDL_ATTRIBUTE") no devuelve nada).
Solución: Xpath supone que los nombres de elemento sin un prefijo de espacio de nombres hacen referencia al espacio de nombres nulo o vacío, no al espacio de nombres predeterminado. La instantánea define un espacio de nombres predeterminado y la mayoría de los elementos pertenecen al espacio de nombres predeterminado.

Para acceder a estos elementos mediante Xpath, el cliente debe asignar primero este espacio de nombres predeterminado a un prefijo explict. Para asignar el espacio de nombres predeterminado de esta manera, use el método pbjects setProperty del documento. La propiedad que se debe establecer es SelectionNamespaces. Use esta propiedad para asignar al espacio de nombres predeterminado un prefijo explict. En la instantánea, el espacio de nombres predeterminado es este URI:

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

La llamada a setProperty podría tener un aspecto similar al ejemplo de código siguiente:

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

El segundo argumento del ejemplo anterior es realmente variant, pero esta complejidad agregada se omite por motivos de simplicidad. La consulta Xpath ahora debe hacer referencia explícitamente al prefijo de espacio de nombres gdl al hacer referencia a elementos del espacio de nombres predeterminado. A continuación, la consulta se convierte en el ejemplo de código siguiente.

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

Síntoma: la interfaz DOM: la propiedad nodeTypedValue siempre devuelve valores como tipos BSTR, independientemente de su xsi:type.
Solución: la implementación actual de MSXML 4.0 solo reconoce los tipos de datos cuando se definen mediante una definición de tipo de datos (DTD). El analizador de GDL usa XSD, que es la recomendación W3C actual.

Síntoma: las cadenas entrecomilladas que contienen caracteres con valores ANSI entre 0 y 0x19 provocan errores de análisis xml (excepto 0x0a, 0x0d y 0x09).
Solución: este error es una característica XML. Estas cadenas deben representarse mediante formatos de datos binarios o binhex de XML. Las versiones futuras de XML pueden aceptar cadenas que contengan estos caracteres.

Síntoma: algunos datos o esquemas de instancia XML definidos mediante passthrough o XSD_DEFINED tipos de datos provocan mensajes de error de validación o analizador XML cuando se cargan en DOM.
Solución: La creación de su propio XML con los tipos de datos PASSTHROUGH o XSD_DEFINED omite el código de generación XML de analizadores de GDL y le expone a las complejidades de XML y las peculiaridades en el analizador DOM. Debe ser lo suficientemente experto con XML para tratar estos problemas antes de usar estos tipos de datos.

Síntoma: el analizador dice "El prefacio no se puede usar con un archivo precompilado", pero el archivo raíz no contiene una directiva de #Precompiled.
Solución: la directiva #Precompiled podría residir realmente en el propio prefacio. El analizador no puede distinguir si el contenido de GDL procede del prefacio o del archivo raíz.