Partilhar via


Solução de problemas de análise de GDL

As informações a seguir abordam algumas das causas de comportamentos inesperados que você pode encontrar ao analisar arquivos GDL.

Sintoma: você inclui o arquivo de esquema, mas o analisador emite uma mensagem de erro que diz "nenhum modelo 'ROOT' encontrado, as entradas GDL não serão modeladas" e ignora o esquema.
Solução: verifique se um modelo ROOT está definido. Se esse modelo for definido, verifique se a diretiva #Include: schema.gdl vem antes de qualquer dado de instância. Caso contrário, o analisador ignorará o esquema.

Sintoma: você define um atributo várias vezes no arquivo GDL e vejo que ele aparece no XML instantâneo apenas uma vez.
Solução: você deve definir um modelo para qualquer atributo que apareça no instantâneo XML várias vezes. Você deve definir a diretiva *Additive. Caso contrário, apenas a definição mais recente será exibida.

Sintoma: o analisador reclama que "[Produção definida em Modelo: "{nome do modelo}" não é atendida pelo constructo real.]", e parece que o número de ocorrências de cada membro está dentro dos limites definidos pela produção.
Solução: primeiro, marcar qual modelo está associado a cada entrada GDL usando a opção -i do analisador GDL. A associação pode não ter ocorrido da maneira que você antecipou. Se a associação parece ter funcionado, lembre-se de que a produção é atendida por uma instância do modelo que nomeou na produção e por qualquer instância de qualquer modelo derivado do modelo nomeado. Portanto, se a produção especificar que apenas uma instância de um modelo específico pode estar presente e se o arquivo de dados real contiver duas instâncias de um modelo derivado desse modelo, a produção será violada. A herança do modelo é rastreada mesmo que o modelo derivado redefina a diretiva *Name.

Sintoma: você recebe uma mensagem de aviso que faz referência a um *InvalidCombination que não existe no arquivo GDL que está sendo analisado.
Solução: o analisador GDL converte diretivas *Constraint em *Diretivas InvalidCombination internamente. Portanto, quando erros são detectados após a conversão, a mensagem se refere à *Restrição como um *InvalidCombination. Além disso, a ordem em que cada elemento de um *InvalidCombination é armazenado internamente não é necessariamente a ordem especificada no arquivo GDL.

Sintoma: o espaço à direita espúrio aparece quando uma referência de macro de valor é substituída por seu valor definido.
Solução: a definição de macro de valor contém um comentário à direita. Mova o comentário para uma linha separada. Na maioria dos contextos, o analisador não diferencia a presença de caracteres de espaço adicionais.

Sintoma: cercar a sintaxe não compatível com um constructo *IgnoreBlock não oculta o conteúdo do Analisador, pois os erros de sintaxe ainda são gerados.
Solução: o conteúdo de *IgnoreBlock ainda deve estar em conformidade com o GDL. *IgnoreBlock apenas impedirá que seu conteúdo apareça nas árvores de dados internas e impedirá que quaisquer diretivas não pré-processadores sejam executadas. Para realmente ocultar algo, use condicionais de pré-processador. Se o fragmento que está sendo oculto em si contiver diretivas de pré-processador que não devem ser executadas, altere o prefixo do pré-processador pouco antes de colocar o fragmento com condicionais de pré-processador.

Sintoma: recursos, constructos e atributos definidos em arquivos designados com *PreCompiled não aparecem no instantâneo XML e não podem ser referenciados pelo arquivo host.
Solução: esse sintoma ocorre por design. Você pode armazenar somente modelos e definições de macro em arquivos pré-compilados.

Sintoma: você não pode referenciar modelos, definições de pré-processador, macros ou outro conteúdo definido em outro lugar de dentro de arquivos designados com *PreCompiled.
Solução: esse sintoma ocorre por design. Os arquivos pré-compilados foram projetados para serem independentes e totalmente independentes do contexto do arquivo de host. Para acessar modelos ou outro conteúdo definido em outro arquivo, você deve colocar uma diretiva #Include que nomeia esse arquivo diretamente no arquivo #PreCompiled. O conteúdo que é indiretamente incluído em virtude de ser incluído (usando #Include) no arquivo de #Include (ou seja, instruções #Include aninhadas) será acessível pelo arquivo de #PreCompiled (pré-compilado raiz). Os arquivos pré-compilados podem incluir (usando #Include) outros arquivos pré-compilados.

Sintoma: recursos ou opções não aparecem no instantâneo na ordem em que você os definiu. Ou a primeira opção não é atribuída como a opção padrão.
Solução: algumas opções podem ter sido definidas anteriormente em outra parte do arquivo GDL ou em um arquivo incluído que foi processado antes da definição de recurso ou opção que você está examinando. A primeira opção processada torna-se a primeira opção, a segunda opção processada torna-se a segunda opção no instantâneo e assim por diante.

Sintoma: você recebe uma mensagem de aviso informando que o analisador de GDL não pode encontrar um modelo referenciado pela diretiva *ElementType, mas esse modelo está definido.
Solução: somente modelos declarados como *Type: DATATYPE podem ser referenciados pela diretiva *ElementType.

Sintoma: os valores de atributos definidos como *FilterTypeName: "CODEPAGE_STRING" não são convertidos em Unicode corretamente.
Solução: se a diretiva *CodePage não estiver definida no momento em que esse atributo for analisado, o analisador pressupõe que a cadeia de caracteres já esteja em Unicode. Verifique se a definição *CodePage aparece antes de qualquer atributo CODEPAGE_STRING.

Sintoma: você definiu o *RequiredDelimiter em sua matriz ou modelo de tipo de dados composto como uma sequência de vários caracteres de espaço ou guias, e o analisador não parece reconhecer os dados reais, mesmo que estejam em conformidade exatamente com a definição do modelo.
Solução: o analisador converte internamente qualquer cadeia de caracteres arbitrária de espaço em branco (caracteres de espaço ou tabulação) em um único caractere de espaço. Portanto, quando o valor for verificado, ele não atenderá à definição do modelo. Para evitar essa situação, especifique apenas um caractere de espaço para *RequiredDelimiter ou use um caractere não em branco para *RequiredDelimiter e use os caracteres de espaço e tabulação para *OptionalDelimiter.

Sintoma: interface DOM: A consulta Xpath não pode localizar elementos no instantâneo (por exemplo, selectSingleNode("/SnapshotRoot/GDL_ATTRIBUTE") não retorna nada).
Solução: O Xpath pressupõe que os nomes de elemento sem um prefixo de namespace se referem ao namespace nulo ou vazio, não ao namespace padrão. O instantâneo define um namespace padrão e a maioria dos elementos pertence ao namespace padrão.

Para acessar esses elementos usando Xpath, o cliente deve primeiro mapear esse namespace padrão para um prefixo explict. Para mapear o namespace padrão dessa maneira, use o método pbjects setProperty do documento. A propriedade que precisa ser definida é SelectionNamespaces. Use essa propriedade para atribuir ao namespace padrão um prefixo explict. No instantâneo, o namespace padrão é este URI:

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

A chamada para setProperty pode ser semelhante ao seguinte exemplo de código:

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

O segundo argumento no exemplo anterior é, na verdade, um Variant, mas essa complexidade adicionada é omitida para simplificar. A consulta Xpath agora deve referenciar explicitamente o prefixo de namespace gdl ao referenciar elementos no namespace padrão. Em seguida, a consulta se torna o exemplo de código a seguir.

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

Sintoma: a interface DOM: a propriedade nodeTypedValue sempre retorna valores como tipos BSTR, independentemente de seu xsi:type.
Solução: a implementação atual do MSXML 4.0 reconhece apenas os tipos de dados quando eles são definidos usando uma DTD (definição de tipo de dados). O analisador GDL usa XSD, que é a recomendação atual do W3C.

Sintoma: as cadeias de caracteres entre aspas que contêm caracteres com valores ANSI entre 0 e 0x19 causam erros de análise de XML (exceto por 0x0a, 0x0d e 0x09).
Solução: esse erro é um recurso XML. Essas cadeias de caracteres devem ser representadas usando formatos de dados binários ou binhex do XML. Versões futuras do XML podem aceitar cadeias de caracteres que contêm esses caracteres.

Sintoma: alguns dados ou esquemas de instância XML definidos usando passthrough ou XSD_DEFINED tipos de dados causam mensagens de erro de validação ou analisador XML quando carregados no DOM.
Solução: criar seu próprio XML usando os tipos de dados PASSTHROUGH ou XSD_DEFINED ignora o código de geração XML dos analisadores de GDL e expõe você às complexidades de XML e peculiaridades no analisador do DOM. Você deve ser proficiente o suficiente com XML para lidar com esses problemas antes de usar esses tipos de dados.

Sintoma: o analisador diz "Preface não pode ser usado com um arquivo pré-compilado", mas o arquivo raiz não contém uma diretiva #Precompiled.
Solução: a diretiva #Precompiled pode realmente residir no próprio prefácio. O analisador não pode distinguir se o conteúdo GDL veio do prefácio ou do arquivo raiz.