2013-06-03 3 views
1

내가 이루고자하는 것은 두 가지 형태 중 하나를 취할 수있는 XML 파일을 설명하는 XML 스키마를 만드는 것입니다. 두 요소 사이에 공통 요소가있는 섹션이 있고 그 다음에 작은 섹션이 있습니다. 같은 뭔가 : 거기에 아이스크림 디저트 그래서중첩없는 XML 선택

<Dessert> 
    <Identifier> Hot Fudge Sundae </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 2 </Duration> 
    <Size> SuperScooper </Size> 
</Dessert> 

<Dessert> 
    <Identifier> Dutch Apple Pie </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 1 </Duration> 
    <AlaMode> 1 </AlaMode> 
    <IceCreamFlavor> Vanilla </IceCreamFlavor> 
</Dessert> 

그냥 크기 동안은 파이에 대한 AlaMode 표시하고 IceCreamFlavor 지정이있다. 내가 달성하고 싶다 무엇

내가 그들을 유효성을 검사 할 수 있도록 Dessert XML은 하나 또는 다른 (Size 또는 AlaModeIceCreamFlavor)을해야합니다 중 하나를 나타 내기 위해 xs:choice 지정자를 사용하는 것입니다.

: 같은 것을

다음을 수행하십시오 내가 할 시도한 무엇

는 두 가지 유형을 생성 할 이런 일을하다

<xs:choice> 
    <xs:element name="Sundae" type="SundaeType" /> 
    <xs:element name="Pie" type="PieType" /> 
</xs:choice> 
0 기존의 파일 구조를 일치하지 않는

<Dessert> 
    <Identifier> Hot Fudge Sundae </Identifier> 
    <SaleDate> 2013-06-03 </SaleDate> 
    <Duration> 2 </Duration> 
    <Sundae> 
    <Size> SuperScooper </Size> 
    <Sundae> 
</Dessert> 

:

그리고 있지만 결과 XML은 물론, 레이아웃과 같이 있습니다.

나는 가능한 모든 요소를 ​​결합하여 간단히 만들 수 있고 xs:choice 물건을 없애 버릴 수는 있지만 실제로는 형식의 기대치를 전달하지 못합니다 (예 : 일요일은 AlaMode 요소).

이 작업을 수행 할 수있는 방법이 있습니까? 나는 단지 하나의 필드가 다른지 의심 스럽지만 나는 이것을 xs:choice (아마)과 함께 달성 할 수 있었고 추가 수준은 없다. 아니면 여기서 뭔가를 놓친 것일 수도 있습니다.

그렇습니다. 레이아웃이 최고는 아니지만 실제로이 시점에서 변경할 수있는 기존 형식입니다. 원본 문서의 요소에 주문을 부과 괜찮다면

답변

2

당신은 XS를 사용하여이 작업을 할 수 있습니다 : 순서 : 대답에 대한

<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:complexType name="Dessert"> 
     <xs:sequence> 
      <xs:element name="Identifier" type="xs:string"/> 
      <xs:element name="SaleDate" type="xs:int"/> 
      <xs:element name="Duration" type="xs:int"/> 
      <xs:choice> 
       <xs:element name="Size" type="xs:string"/> 
       <xs:sequence> 
        <xs:element name="AlaMode" type="xs:int"/> 
        <xs:element name="IceCreamFlavor" type="xs:string"/> 
       </xs:sequence> 
      </xs:choice> 

     </xs:sequence> 
    </xs:complexType> 

    <xs:element name="Dessert" type="Dessert"/> 
</xs:schema> 
+0

감사합니다. 이것은 나에게 도움이되었다. – itsmatt