다음을 통해 공유


GDL 구문 분석 문제 해결

다음 정보는 GDL 파일을 구문 분석할 때 발생할 수 있는 예기치 않은 동작의 몇 가지 원인에 대해 설명합니다.

증상: 스키마 파일을 포함하지만 파서는 "'ROOT' 템플릿을 찾을 수 없고 GDL 항목이 템플릿화되지 않습니다"라는 오류 메시지를 내보내고 스키마를 무시합니다.
해결 방법: ROOT 템플릿이 정의되어 있는지 확인합니다. 이러한 템플릿이 정의된 경우 #Include: schema.gdl 지시문이 instance 데이터 앞에 오는지 확인합니다. 그렇지 않으면 파서는 스키마를 무시합니다.

증상: GDL 파일에서 특성을 여러 번 정의하면 XML 스냅샷 한 번만 표시됩니다.
해결 방법: XML 스냅샷 여러 번 표시되는 특성에 대한 템플릿을 정의해야 합니다. *Additive 지시문을 정의해야 합니다. 그렇지 않으면 가장 최근의 정의만 표시됩니다.

증상: 파서는 "[템플릿: "{template name}"에 정의된 프로덕션이 실제 구문에 의해 충족되지 않습니다.]"라고 불평하며 각 멤버의 발생 횟수가 프로덕션에서 정의하는 범위 내에 있는 것으로 보입니다.
해결 방법: 먼저 GDL 파서의 -i 옵션을 사용하여 각 GDL 항목에 바인딩된 템플릿을 검사. 바인딩이 예상한 방식으로 발생하지 않았을 수 있습니다. 바인딩이 작동하는 것처럼 보이는 경우 프로덕션에서 명명된 템플릿의 instance 명명된 템플릿과 명명된 템플릿에서 파생된 모든 템플릿의 instance 프로덕션이 충족됩니다. 따라서 프로덕션에서 특정 템플릿의 instance 하나만 있을 수 있음을 지정하고 실제 데이터 파일에 해당 템플릿에서 파생된 템플릿의 두 인스턴스가 포함된 경우 프로덕션이 위반됩니다. 파생된 템플릿이 *Name 지시문을 다시 정의하더라도 템플릿 상속이 추적됩니다.

증상: 구문 분석 중인 GDL 파일에 존재하지 않는 *InvalidCombination을 참조하는 경고 메시지가 표시됩니다.
해결 방법: GDL 파서는 *Constraint 지시문을 내부적으로 *InvalidCombination 지시문으로 변환합니다. 따라서 변환 후 오류가 감지되면 메시지는 *제약 조건을 *InvalidCombination으로 참조합니다. 또한 *InvalidCombination의 각 요소가 내부적으로 저장되는 순서가 반드시 GDL 파일에 지정된 순서는 아닙니다.

증상: 값 매크로 참조를 정의된 값으로 바꾸면 가짜 후행 공백이 나타납니다.
해결 방법: 매크로 정의 값에는 후행 주석이 포함됩니다. 주석을 별도의 줄로 이동합니다. 대부분의 컨텍스트에서 파서는 추가 공백 문자가 있는 것을 구분하지 않습니다.

증상: 구문 오류가 계속 생성되기 때문에 *IgnoreBlock 구문이 있는 비규격 구문은 구문에서 콘텐츠를 숨기지 않습니다.
해결 방법: *IgnoreBlock의 콘텐츠는 여전히 GDL을 준수해야 합니다. *IgnoreBlock은 해당 내용이 내부 데이터 트리에 나타나지 않도록 하고 전처리기 이외의 지시문이 실행되지 않도록 합니다. 실제로 무언가를 숨기려면 전처리기 조건부를 사용합니다. 숨겨지는 조각 자체에 실행해서는 안 되는 전처리기 지시문이 포함된 경우 전처리기 조건부로 조각을 묶기 직전에 전처리기 접두사를 변경합니다.

증상: *PreCompiled로 지정된 파일 내에 정의된 기능, 구문 및 특성은 XML 스냅샷 표시되지 않으며 호스트 파일에서 참조할 수 없습니다.
해결 방법: 이 증상은 의도적으로 발생합니다. 미리 컴파일된 파일 내에 템플릿 및 매크로 정의만 저장할 수 있습니다.

증상: *PreCompiled로 지정된 파일 내에서 다른 곳에서 정의된 템플릿, 전처리기 정의, 매크로 또는 기타 콘텐츠를 참조할 수 없습니다.
해결 방법: 이 증상은 의도적으로 발생합니다. 미리 컴파일된 파일은 자체 포함되며 호스트 파일의 컨텍스트와 완전히 독립적이도록 설계되었습니다. 템플릿 또는 다른 파일에 정의된 다른 콘텐츠에 액세스하려면 해당 파일의 이름을 #PreCompiled 파일 내에 직접 이름을 지정하는 #Include 지시문을 배치해야 합니다. #Include 파일(즉, 중첩된 #Include 문) 내에 포함된 콘텐츠(#Include 사용)를 통해 간접적으로 포함된 콘텐츠는 루트 미리 컴파일된(#PreCompiled) 파일에서 액세스할 수 있습니다. 미리 컴파일된 파일에는 미리 컴파일된 다른 파일(#Include 사용)이 포함될 수 있습니다.

증상: 기능 또는 옵션은 스냅샷 정의한 순서대로 표시되지 않습니다. 또는 첫 번째 옵션이 기본 옵션으로 할당되지 않습니다.
해결 방법: 일부 옵션은 이전에 GDL 파일의 다른 부분이나 보고 있는 기능 또는 옵션 정의 이전에 처리된 포함된 파일에서 정의되었을 수 있습니다. 처리되는 첫 번째 옵션은 첫 번째 옵션이 되고, 처리되는 두 번째 옵션은 스냅샷 두 번째 옵션이 됩니다.

증상: GDL 파서가 *ElementType 지시문에서 참조하는 템플릿을 찾을 수 없지만 해당 템플릿이 정의되어 있다는 경고 메시지가 표시됩니다.
해결 방법: *Type: DATATYPE으로 선언된 템플릿만 *ElementType 지시문에서 참조할 수 있습니다.

증상: *FilterTypeName으로 정의된 특성 값: "CODEPAGE_STRING"이 유니코드로 제대로 변환되지 않습니다.
해결 방법: 이 특성을 구문 분석할 때 *CodePage 지시문이 정의되지 않은 경우 파서는 문자열이 이미 유니코드에 있다고 가정합니다. *CodePage 정의가 CODEPAGE_STRING 특성 앞에 표시되는지 확인합니다.

증상: 배열 또는 복합 데이터 형식 템플릿에서 *RequiredDelimiter를 여러 공백 문자 또는 탭의 시퀀스로 정의했으며, 파서는 템플릿 정의를 정확히 준수하더라도 실제 데이터를 인식하지 못하는 것처럼 보입니다.
해결 방법: 파서는 내부적으로 공백의 임의의 문자열(공백 또는 탭 문자)을 단일 공백 문자로 변환합니다. 따라서 값을 선택하면 템플릿 정의가 충족되지 않습니다. 이러한 상황을 방지하려면 *RequiredDelimiter에 공백 문자를 하나만 지정하거나 *RequiredDelimiter에 공백이 아닌 문자를 사용하고 *OptionalDelimiter의 공백과 탭 문자를 사용합니다.

증상: DOM 인터페이스: Xpath 쿼리는 스냅샷 요소를 찾을 수 없습니다(예: selectSingleNode("/SnapshotRoot/GDL_ATTRIBUTE")는 아무 것도 반환하지 않습니다.
해결 방법: Xpath는 네임스페이스 접두사 없는 요소 이름이 기본 네임스페이스가 아닌 null 또는 빈 네임스페이스를 참조한다고 가정합니다. 스냅샷 기본 네임스페이스를 정의하고 대부분의 요소는 기본 네임스페이스에 속합니다.

Xpath를 사용하여 이러한 요소에 액세스하려면 클라이언트가 먼저 이 기본 네임스페이스를 설명 접두사에 매핑해야 합니다. 이러한 방식으로 기본 네임스페이스를 매핑하려면 문서 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 속성은 xsi:type에 관계없이 항상 BSTR 형식으로 값을 반환합니다.
해결 방법: MSXML 4.0의 현재 구현은 DTD(데이터 형식 정의)를 사용하여 정의된 데이터 형식만 인식합니다. GDL 파서는 현재 W3C 권장 사항인 XSD를 사용합니다.

증상: ANSI 값이 0에서 0x19 사이의 문자를 포함하는 따옴표 붙은 문자열은 XML 구문 분석 오류를 발생합니다(0x0a, 0x0d 및 0x09 제외).
해결 방법: 이 오류는 XML 기능입니다. 이러한 문자열은 XML의 이진 데이터 형식 또는 binhex 데이터 형식을 사용하여 표현되어야 합니다. 이후 버전의 XML은 이러한 문자를 포함하는 문자열을 허용할 수 있습니다.

증상: PASSTHROUGH 또는 XSD_DEFINED 데이터 형식을 사용하여 정의된 일부 XML instance 데이터 또는 스키마는 DOM에 로드될 때 XML 파서 또는 유효성 검사 오류 메시지를 발생합니다.
해결 방법: PASSTHROUGH 또는 XSD_DEFINED 데이터 형식을 사용하여 사용자 고유의 XML을 만들면 GDL 파서 XML 생성 코드가 무시되고 DOM 파서에서 XML 및 단점의 복잡성에 노출됩니다. 이러한 데이터 형식을 사용하기 전에 XML에 충분히 능숙하여 이러한 문제를 처리해야 합니다.

증상: 파서는 "미리 컴파일된 파일과 함께 서체를 사용할 수 없습니다"라고 말하지만 루트 파일에는 #Precompiled 지시문이 포함되어 있지 않습니다.
해결 방법: #Precompiled 지시문은 실제로 서문 자체에 있을 수 있습니다. 파서는 GDL 콘텐츠가 서문 또는 루트 파일에서 왔는지 여부를 구분할 수 없습니다.