다음을 통해 공유


문서 수준 사용자 지정의 XML 스키마 및 데이터

중요 Microsoft Word와 관련하여 이 항목에 설명된 정보는 미국 및 해당 지역 외부에 있거나 Microsoft가 Microsoft Word에서 사용자 지정 XML과 관련된 특정 기능의 구현을 제거한 2010년 1월 이전에 Microsoft에서 라이선스를 부여한 Microsoft Word 제품을 실행하는 프로그램을 사용 중이거나 개발 중인 개인 및 조직의 혜택 및 사용을 위해서만 제공됩니다. Microsoft Word에 관한 이 정보는 2010년 1월 10일 이후에 Microsoft에서 라이선스를 부여한 Microsoft Word 제품을 실행하는 프로그램을 사용 중이거나 개발 중인 미국 또는 해당 지역의 개인 또는 조직이 읽거나 사용할 수 없습니다. 이 제품은 해당 날짜 이전에 라이선스를 부여했거나 미국 외부에서 사용하기 위해 구매되거나 사용이 허가된 제품과 동일하게 작동하지 않습니다.

적용 대상: 이 항목의 정보는 Excel 및 Word의 문서 수준 프로젝트에 적용됩니다. 자세한 내용은 Office 애플리케이션 및 프로젝트 형식에 따라 사용 가능한 기능을 참조하세요.

Microsoft Office Excel 및 Microsoft Office Word는 스키마를 문서에 매핑하는 기능을 제공합니다. 이 기능은 XML 데이터를 문서에서 가져오고 내보내는 작업을 간소화할 수 있습니다.

Visual Studio는 문서 수준 사용자 지정의 매핑된 스키마 요소를 프로그래밍 모델의 컨트롤로 노출합니다. Excel의 경우 Visual Studio는 데이터베이스, 웹 서비스 및 개체의 데이터에 컨트롤을 바인딩하기 위한 지원을 추가합니다. Word 및 Excel의 경우 Visual Studio는 스키마 매핑된 문서에서 솔루션에 대한 향상된 최종 사용자 환경을 만드는 데 사용할 수 있는 작업 창에 대한 지원을 추가합니다. 자세한 내용은 작업 창 개요를 참조하세요.

참고 항목

Excel 솔루션에서는 다중 파트 XML 스키마를 사용할 수 없습니다.

스키마가 Excel 통합 문서에 연결될 때 만들어진 개체

통합 문서에 스키마를 연결하면 Visual Studio에서 자동으로 여러 개체를 만들고 프로젝트에 추가합니다. 이 개체는 Excel에서 관리되므로 Visual Studio 도구를 사용하여 삭제하면 안 됩니다. 삭제하려면 워크시트에서 매핑된 요소를 제거하거나 Excel 도구를 사용하여 스키마를 분리합니다.

두 가지 주요 개체가 있습니다.

  • XML 스키마(XSD 파일). 통합 문서의 모든 스키마에 대해 Visual Studio는 프로젝트에 스키마를 추가합니다. 이 스키마는 솔루션 탐색기에 XSD 확장과 함께 프로젝트 항목으로 표시됩니다.

  • 형식화된 DataSet 클래스. 이 클래스는 스키마를 기반으로 만들어집니다. 이 데이터 세트 클래스는 클래스 뷰에 표시됩니다.

스키마 요소를 Excel 워크시트에 매핑할 때 만들어진 개체

XML 소스 작업 창의 스키마 요소를 워크시트에 매핑하면 Visual Studio에서 자동으로 여러 개체를 만들고 프로젝트에 추가합니다.

  • 컨트롤. 통합 문서의 모든 매핑된 개체에 대해 XmlMappedRange 컨트롤(반복되지 않는 스키마 요소의 경우) 또는 ListObject 컨트롤(반복 스키마 요소의 경우)이 프로그래밍 모델에 만들어집니다. ListObject 컨트롤은 통합 문서에서 매핑 및 매핑된 개체를 삭제하는 방식으로만 삭제할 수 있습니다. 컨트롤에 대한 자세한 내용은 호스트 항목 및 호스트 컨트롤 개요를 참조하세요.

  • BindingSource. 반복되지 않는 스키마 요소를 워크시트에 매핑하여 XmlMappedRange를 만들면 BindingSource 컨트롤이 만들어지고 XmlMappedRange 컨트롤이 BindingSource에 바인딩됩니다. 문서에 매핑된 스키마와 일치하는 데이터 소스 인스턴스(예: 생성된 형식화된 BindingSource 클래스 인스턴스)에 DataSet를 바인딩해야 합니다. 속성 창에 노출되는 DataSourceDataMember 속성을 설정하여 바인딩을 만듭니다.

    참고 항목

    BindingSourceListObject 개체에 대해 만들어지지 않습니다. 속성 창에서 DataSourceDataMember 속성을 설정하여 데이터 소스에 ListObject를 수동으로 바인딩해야 합니다.

Office 매핑된 스키마 및 Visual Studio 데이터 소스 창

Office의 매핑된 스키마 기능과 Visual Studio 데이터 소스 창은 모두 보고 또는 편집을 위해 Excel 워크시트에 데이터를 표시하는 데 도움이 될 수 있습니다. 두 경우 모두 데이터 요소를 Excel 워크시트로 끌어올 수 있습니다. 두 방법은 모두 BindingSource를 통해 DataSet 또는 웹 서비스 등의 데이터 소스에 바인딩된 데이터인 컨트롤을 만듭니다.

참고 항목

반복 스키마 요소를 워크시트에 매핑하면 Visual Studio는 ListObject를 만듭니다. ListObjectBindingSource를 통해 데이터에 자동으로 바인딩되지 않습니다. 속성 창에서 DataSourceDataMember 속성을 설정하여 데이터 소스에 ListObject를 수동으로 바인딩해야 합니다.

다음 표에서는 두 방법의 몇 가지 차이점을 보여 줍니다.

XML 스키마 데이터 소스 창
Office 인터페이스를 사용합니다. Visual Studio에서 데이터 소스 창을 사용합니다.
XML 파일에서 데이터를 가져오고 내보내기 위한 기본 제공 Office 기능을 사용하도록 설정합니다. 가져오기 및 내보내기 기능을 프로그래밍 방식으로 제공해야 합니다.
생성된 컨트롤을 데이터로 채우는 코드를 작성해야 합니다. 데이터 소스 창에서 추가된 컨트롤에는 데이터베이스 서버를 사용할 때 필요한 연결 문자열과 함께 컨트롤을 채우기 위한 코드가 자동으로 생성됩니다.

스키마가 Word 문서에 연결되는 경우의 동작

문서 수준 Office 프로젝트에서 사용되는 Word 문서에 스키마를 연결하는 경우에는 데이터 개체가 만들어지지 않습니다. 그러나 스키마 요소를 문서에 매핑하면 컨트롤이 만들어집니다. 컨트롤의 형식은 매핑하는 요소의 형식에 따라 달라집니다. 반복 요소는 XMLNodes 컨트롤을 생성하고 반복되지 않는 요소는 XMLNode 컨트롤을 생성합니다. 자세한 내용은 XMLNodes 컨트롤XMLNode 컨트롤을 참조하세요.

XML 스키마를 포함하는 솔루션 배포

문서에 매핑된 XML 스키마를 사용하는 솔루션을 배포하려면 설치 관리자를 만들어야 합니다. 설치 관리자는 사용자 컴퓨터의 스키마 라이브러리에 스키마를 등록해야 합니다. 스키마를 등록하지 않으면 사용자가 스키마를 열 때 Word가 문서에 있는 요소를 기반으로 임시 스키마를 생성하므로 솔루션이 계속 작동합니다. 그러나 사용자는 프로젝트를 만드는 데 사용된 스키마에 대해 유효성 검사를 수행하거나 스키마를 저장할 수 없습니다. 자세한 내용은 애플리케이션, 서비스 및 구성 요소 배포를 참조하세요.

스키마가 라이브러리에 있고 등록되었는지 확인하기 위한 코드를 프로젝트에 추가할 수도 있습니다. 그렇지 않은 경우 사용자에게 경고할 수 있습니다.

// Ensure that the schema is in the library and registered with the document.
private bool CheckSchema()
{
    const string namespaceUri = "http://schemas.contoso.com/projects";
    bool namespaceFound = false;
    bool namespaceRegistered = false;

    foreach (Word.XMLNamespace n in Application.XMLNamespaces)
    {
        if (n.URI == namespaceUri)
        {
            namespaceFound = true;
        }
    }

    if (!namespaceFound)
    {
        MessageBox.Show("XML Schema is not in library.");
        return false;
    }

    foreach (Word.XMLSchemaReference r in this.XMLSchemaReferences) 
    {
        if (r.NamespaceURI == namespaceUri)
        {
            namespaceRegistered = true;
        }
    }

    if (!namespaceRegistered)
    {
        MessageBox.Show("XML Schema is not registered for this document.");
        return false;
    }
    
    return true;
}