다음을 통해 공유


XAML 파서 아키텍처

WPF Designer for Visual Studio에서는 XAML(Extensible Application Markup Language) 문서를 로드하고 Visual Studio에서 표시할 WPF 개체를 만듭니다. 로드 도중 발생하는 오류는 오류 목록 창에 표시됩니다.

XAML 로드 단계

WPF Designer에서 XAML 문서를 로드하고 해당 AST(추상 구문 트리)를 만듭니다. AST는 구문 분석된 XAML을 나타내는 데이터 구조입니다. 이는 유한하고 레이블이 지정되며 방향이 있는 트리로, 내부 노드는 연산자에 따라 레이블이 지정되고 리프 노드는 노드 연산자의 피연산자를 나타냅니다. 리프에는 변수 또는 상수인 nullary 연산자가 있습니다.

XAML 문서를 로드할 때는 다음 표와 같은 여러 단계를 거치게 됩니다.

XAML 로드 단계

설명

XML 구문 확인

스캐너: 형식이 잘못된 항목이나 잘못된 문자가 있는지 확인하고 어휘 토큰을 만드는 어휘 단계입니다.

파서: AST를 만들고 쌍 분석을 수행하여 태그의 형식이 정확하고 짝이 맞는지 확인합니다.

XAML 구문 확인

ConvertToXaml에서 모든 형식을 조회하고 형식 정보를 XAML AST에 배치한 다음 XAML AST에 주석을 답니다.

유효성 검사를 통해 오류를 검사하고 트리에서 노드의 위치를 확인합니다.

모델 및 개체 인스턴스화

AST 전체를 다시 한 번 처리하여 편집 모델 및 WPF 개체를 만드는 별도의 단계입니다.

이전 단계에서 오류가 발생한 노드는 잘못된 것으로 표시되어 이후 단계에서 다시 처리되지 않습니다. 스캐너 및 파서 단계에서 오류가 발생하면 모델 및 개체 인스턴스화 단계가 실행되지 않습니다.

XML 구문 확인

스캐너 및 파서 단계에서는 로드할 문서가 XML 구문 오류가 없는 올바른 XML 문서인지 확인합니다. XML 구문 오류의 예로는 <Button> 태그에 짝이 맞는 </Button> 끝 태그가 없는 경우가 있습니다. 파서에서는 오류 복구를 시도하므로 문서를 한 번 구문 분석할 때 여러 오류가 보고될 수도 있습니다.

XAML 구문 확인

파서는 별도의 단계를 통해 XML AST를 순회하며 문서가 유효한 XAML 문서인지 확인합니다. 즉, XAML XML 스키마에 맞으며 잘못된 XAML이 들어 있지 않은지 확인합니다. 잘못된 XAML의 예로는 <Button SomeProperty="Mark">와 같이 속성 선언이 잘못 사용된 요소가 있습니다.

이러한 단계에서 형식이 확인되므로 요소 형식을 기준으로 요소 이름 및 속성 이름과 같은 정보의 유효성을 검사할 수 있습니다. 예를 들어 파서는 SomeProperty가 Button의 속성인지 확인합니다. 형식이 없는 경우에는 오류가 발생합니다.

파서에서는 오류 복구를 시도하므로 문서를 한 번 구문 분석할 때 여러 오류가 보고될 수도 있습니다. 그러나 발생 가능한 오류가 모두 보고되는 것은 아닙니다. 예를 들어 요소 이름의 철자가 잘못되고 해당 요소 내에서 속성 이름의 철자가 잘못된 경우 처음에는 요소 오류만 보고됩니다. 이는 요소가 제대로 확인될 때까지 속성 이름의 유효성을 검사할 수 없기 때문입니다.

참고

이 단계에서는 속성 값의 유효성을 검사하지 않습니다. 예를 들어 이 단계에서는 <Button Background="xBlue"/>가 오류로 감지되지 않습니다. 자세한 내용은 이 항목의 뒷부분을 참조하십시오.

모델 및 개체 인스턴스화

구문 확인이 끝나면 XAML에 해당하는 AST가 만들어지며, XAML별 문서 트리는 해당 AST에 대한 뷰 또는 커서 역할을 합니다.

마지막 단계에서는 모델 및 내부 인스턴스가 인스턴스화되고 속성 값이 문자열에서 해당 형식으로 변환되어 할당됩니다. 파서는 이를 위해 문서 트리 관리자 클래스를 사용하여 문서 트리를 만듭니다. XAML에 대한 문서 트리가 만들어질 때 내부 WPF 인스턴스도 만들어집니다. 이러한 인스턴스는 디자이너에서 뷰로 사용됩니다.

모델 및 인스턴스를 만들 때 예외가 발생하면 오류가 발생한 노드의 자식에 대한 개체가 만들어지지 않습니다. 트리의 나머지 부분에 대한 모델이 생성되며, 따라서 여러 가지 오류가 발생할 수 있습니다.

예를 들어 <Button Background="Test"/>라는 코드 조각에서 Brush 형식의 TypeConverter는 Test를 Brush 인스턴스로 변환하려고 합니다. Test는 유효한 Brush 값이 아니므로 형식 변환기에서 예외가 발생하여 모든 자식 노드의 구문 분석 프로세스가 중지되지만, 문서의 나머지 부분은 그대로 구문 분석됩니다.

소유하는 개체가 인스턴스화되면 속성 값이 문자열에서 해당 형식으로 변환됩니다. 이 작업은 소유하는 개체가 디자인 화면에서 사용될 때 수행됩니다. 부모 개체가 디자이너에서 사용되기 전에는 여러 가지 값 범위 오류가 보고되지 않습니다.

이 동작은 WPF 컴파일과 유사합니다. WPF 컴파일러는 컴파일 도중 특성(속성) 값의 유효성을 검사하거나 변환하지 않습니다. 형식 변환기는 런타임에 WPF에 의해 개체 트리가 인스턴스화될 때까지 호출되지 않습니다.

참고

외부 리소스 사전을 로드하려면 편집 모델과 파서가 상호 작용해야 합니다. 편집 모델에서 추가 XAML 파일을 로드해야 하는 경우 XAML 로드 작업이 트리거됩니다.

오류 메시지

WPF Designer 오류 메시지 도움말 항목은 오류가 발생한 XAML 로드 단계를 설명해 줍니다. 다음 표에서는 각 단계에 해당하는 메시지를 보여 줍니다.

XAML 로드 단계

오류 메시지

XML 구문 확인

XAML 파일이 올바른 형식의 XML 문서가 아닌 경우에 이 오류가 발생합니다.

XAML 구문 확인

파일이 유효한 XML 문서이지만 올바른 형식의 XAML 문서가 아닌 경우에 이 오류가 발생합니다.

모델 및 개체 인스턴스화

파일이 올바른 형식의 XAML 문서이지만 하나 이상의 형식 불일치가 포함된 경우에 이 오류가 발생합니다.

참고 항목

개념

XAML 오류 및 도움말

기타 리소스

WPF Designer의 오류 메시지 참조

WPF의 XAML