2017-09-20 6 views
1

나는 다음과 같은 XSD 스키마가 : 스키마에서 볼 수 있듯이Restict의 XML 요소

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:complexType name="Vehicle"> 
    <xs:sequence> 
    <xs:element name="numberOfWheels" type="xs:int" minOccurs="0" maxOccurs="1"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:element name="car" type="Car"/> 
<xs:complexType name="Car"> 
    <xs:complexContent> 
    <xs:extension base="Vehicle"> 
     <xs:sequence> 
     <xs:element name="numberOfSeats" type="xs:int" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="motorCycle" type="MotorCycle"/> 
<xs:complexType name="MotorCycle"> 
    <xs:complexContent> 
    <xs:extension base="Vehicle"> 
     <xs:sequence> 
     <xs:element name="hasLuggageCompartment" type="xs:boolean" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="wagon" type="Wagon"/> 
<xs:complexType name="Wagon"> 
    <xs:complexContent> 
    <xs:extension base="Vehicle"> 
     <xs:sequence> 
     <xs:element name="typeOfCargo" type="xs:string" minOccurs="0" maxOccurs="1"/> 
     </xs:sequence> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="vehicleList" type="VehicleList"/> 
<xs:complexType name="VehicleList"> 
    <xs:sequence> 
    <xs:element <!-- what to do here? --> minOccurs="1" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:complexType> 

</xs:schema> 

, 우리는 유형 "자동차", "오토바이"와 "왜건"그들 모두가를 "Vehicle"유형을 확장했습니다.

"Car", "MororCycle"유형의 요소를 저장할 수 있도록 "Vehicle"을 확장하는 한 모든 요소를 ​​저장할 수있는 컨테이너 요소를 내 스키마 (VehicleList)에 소개하고자합니다. 또는 "Wagon"을 포함하지만, "Cow"유형의 요소는 "Animal"유형을 확장 할 수 없기 때문에 이러한 요소가 없습니다.

나는 이미 많이 검색했기 때문에 OO 프로그래밍에서 자주 사용되는 것처럼 "조상"유형을 기반으로 XML 스키마에서 이러한 종류의 제한을 도입 할 수 있다고 생각하지 않습니다.

그래서 내 질문 : 그것은 확장 유형에 따라 포함 된 요소를 제한하는 컨테이너 요소를 선언 할 수 있으며, 그렇다면 어떻게됩니까?

답변과 제안에 미리 감사드립니다. 복합 유형 및 XSI 사용

+0

원하는 XSD로 검증해야하는 XML 문서를 우리와 공유 할 수 있습니까? – DMC19

답변

1

: 유형

가장 쉽고 확장 가능한 방법은 자동차로 유형을 설정하는 것입니다.

<xs:complexType name="VehicleList"> 
    <xs:sequence> 
     <xs:element name="VehicleElm" 
         type="Vehicle" 
         minOccurs="1" 
         maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:complexType> 

결과 XML은 전적으로 당신이 원하는 것이 아닐 수도 같은, 보일 것이다 그러나합니다 (XSI의 추가 : 유형 속성) 대체 그룹을 사용

<?xml version="1.0" encoding="utf-8"?> 
<!-- Created with Liquid Studio 2018 - Developer Bundle 16.0.0.0 (https://www.liquid-technologies.com) --> 
<vehicleList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:noNamespaceSchemaLocation="XSDFile.xsd"> 
    <VehicleElm xsi:type="Car"> 
     <numberOfWheels>4</numberOfWheels> 
     <numberOfSeats>2</numberOfSeats> 
    </VehicleElm> 
    <VehicleElm xsi:type="Wagon"> 
     <numberOfWheels>6</numberOfWheels> 
     <typeOfCargo>stuff</typeOfCargo> 
    </VehicleElm> 
</vehicleList> 

대안은 XSD에서 약간 더 복잡한 대체 그룹을 사용하지만 더 깨끗한 XML을 제공합니다.

enter image description here

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid Studio 2018 - Developer Bundle 16.0.0.0 (https://www.liquid-technologies.com)--> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="VehicleType"> 
     <xs:sequence> 
      <xs:element name="numberOfWheels" 
          type="xs:int" 
          minOccurs="0" 
          maxOccurs="1" /> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="Vehicle" 
        type="VehicleType" 
        abstract="true" /> 
    <xs:element name="car" 
        substitutionGroup="Vehicle"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="VehicleType"> 
        <xs:sequence> 
         <xs:element name="numberOfSeats" 
             type="xs:int" 
             minOccurs="0" 
             maxOccurs="1" /> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="motorCycle" 
        substitutionGroup="Vehicle"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="VehicleType"> 
        <xs:sequence> 
         <xs:element name="hasLuggageCompartment" 
             type="xs:boolean" 
             minOccurs="0" 
             maxOccurs="1" /> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="wagon" 
        substitutionGroup="Vehicle"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="VehicleType"> 
        <xs:sequence> 
         <xs:element name="typeOfCargo" 
             type="xs:string" 
             minOccurs="0" 
             maxOccurs="1" /> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="vehicleList" 
        type="VehicleList" /> 
    <xs:complexType name="VehicleList"> 
     <xs:sequence> 
      <xs:element ref="Vehicle" 
          minOccurs="1" 
          maxOccurs="unbounded" /> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

결과 XML은 모든 해당 요소의 차량을 사용할 수있는 기본적으로, 대체 그룹 멤버 중 하나가 그 자리에서 사용할 수있는이

<?xml version="1.0" encoding="utf-8"?> 
<!-- Created with Liquid Studio 2018 - Developer Bundle 16.0.0.0 (https://www.liquid-technologies.com) --> 
<vehicleList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xsi:noNamespaceSchemaLocation="XSDFile2.xsd"> 
    <car> 
     <numberOfWheels>4</numberOfWheels> 
     <numberOfSeats>2</numberOfSeats> 
    </car> 
    <motorCycle> 
     <numberOfWheels>2</numberOfWheels> 
     <hasLuggageCompartment>false</hasLuggageCompartment> 
    </motorCycle> 
</vehicleList> 

같이 보입니다하고 있기 때문에 차량 요소는 추상 요소이므로 자체적으로 사용할 수 없습니다. 따라서 대체 그룹 멤버를 사용해야합니다.

+0

대단히 감사합니다! 실제로 대체 그룹 멤버들과 작업하면서 처음으로 지금 보았던 부분은 xsd 레벨에서 좀 더 복잡하지만 분명히 xml이 더 깨끗하게 나옵니다. 나는 그것이 내가 원하는 행동과 정확히 같기 때문에 내가 그것을 갈 것이라고 생각한다. –

+0

@WimHuygen, 응답에서 질문에 답하면 * accept * it. 그렇지 않으면 문제가 아직 해결되지 않은 것처럼 보입니다. –

+0

우리가 말한대로 행해져. –