2015-01-13 3 views

답변

1

쉬운 방법이 없습니다.

사용자 정의 xsd.exe 동작은 일반적으로 쉽게 가능합니다. 그것은 .NET 라이브러리 (System.Xml) 위에 얇은 계층입니다. 그러나 이러한 라이브러리는 XSD 1.1을 이해하지 못하기 때문에 XSD 1.0 문서를 제공해야합니다. 스키마를 구형 명세 언어로 변환 할 수 있다면 수정되지 않은 xsd.exe도 사용할 수 있습니다.

목적에 따라 XSD 1.1 스키마를 XSD 1.0 스키마로 변형 할 수 있습니까? 어떤 경우에는 쉽습니다. 예를 들어, 매우 단순한 XSLT 변환은 어설 션을 걸러 내고, 적합한 데이터 유형을 적합한 XSD 1.0 데이터 유형으로 바꿀 수 있습니다. 그러나 일반적인 경우는 열심히하고 해결할 수없는 곳 사이입니다. XSD 1.1 그냥 무시할 수없는 기능이 추가 어디 보자 :.

<complexType name="base"> 
    <complexContent> 
    <sequence> 
     <element ref="tns:a" minOccurs="0" maxOccurs="1"/> 
     <choice minOccurs="0" maxOccurs="unbounded"> 
     <element ref="tns:b"/> 
     <element ref="tns:c"/> 
     </choice> 
    </sequence> 
    </complexContent> 
</complexType> 

<complexType name="derived"> 
    <complexContent> 
    <restriction base="tns:base"> 
     <sequence> 
     <choice minOccurs="0" maxOccurs="unbounded"> 
      <element ref="tns:b"/> 
      <element ref="tns:c"/> 
     </choice> 
     </sequence> 
    </restriction> 
    </complexContent> 
</complexType> 

(샘플 here에서 촬영을 즉, 특정 스키마에 표현, 또는 XSD 1.0으로 변환 할 수 있는지 추정하는 좋은 출발점이다)

샘플은 XSD 1.1에서 자연스럽게 상속 된 사용법을 보여줍니다. 파생 된 유형이 실제로 수행하는 모든 작업은 멤버 tns:a을 금지합니다. XSD 1.0에서 똑같은 작업을 수행하려면 형식에 tns:amaxOccurs='0'과 함께 나열해야하며 해당 C# 클래스 a 멤버가 포함 된이됩니다. XSD 1.1에서 XSD 1.0 로의 이러한 다운 그레이드 변환은이 간단한 예제를 제공하기 위해 함께 조합하기가 상대적으로 쉽지만 제한된 선택적 멤버 및/또는 와일드 카드를 사용하여 전체 상속 계층에 걸쳐 파티클을 매핑해야하는 경우 기본적으로 불가능합니다. XSD 1.0은 표현력이 부족합니다.

지금 일반적인 질문입니다. 스키마가 미리 알려지지 않았거나 새로운 XSD 1.1 기능을 많이 사용한다고 가정합니다. XSD 1.0으로 변환 할 수 없으므로 .NET 기본 클래스 라이브러리는 C# 클래스를 생성하는 데 도움이되지 않습니다. 두 개 또는 세 개의 옵션이 남아 있습니다.

  • 수동으로 직렬화 해제 클래스를 만들 수 있습니다. 유효성을 검사하고 역 직렬화 할 수는 없지만 올바른 특성 기본값 (유지하려는 유효성 검사의 일반적인 부작용)을 적용하는 것을 포함하여 유효한 문서를 deserialize 할 수 있습니다.
  • 고유 한 XSD 1.1 구문 분석 지원을 만들 수 있습니다. 매우 큰 프로젝트입니다. 많은 스키마 (assert에 대한 전체 XSLT 2.0 스펙과 같은)를 무시하고 여전히 자연스러운 C# 클래스로 끝낼 수는 있습니다.
  • 기존 타사 라이브러리를이 기능으로 가져올 수 있습니다. 지금 선택할 수있는 빈 세트, 나는 의심한다. Saxon의 API는 스키마에서 deserialization 클래스를 생성하지 않습니다. 그리고 .NET 플랫폼에서 사용할 수있는 다른 XSD 1.1 구현을 알지 못합니다.
+1

감사합니다. Jirka, 귀하의 답변은 매우 포괄적입니다. 불행하게도 저는 통합을 이루기 위해 서둘러 있었기 때문에 트릭을 사용했습니다 : 1을 제거했습니다.다행히도 "단언"한 1 태그! :) – user3568107

+0

@ user3568107 - 경험을 병렬 답변으로 자유롭게 확장하거나, 1.0 스키마 만 거의 필요로하는 많은 사람들이이를 더 쉽게 이해할 수 있도록 편집 할 수 있습니다. –

관련 문제