2012-08-16 2 views
0

2 개의 다른 xml에 대해 하나의 스키마 파일을 만들려고합니다 (두 개의 스키마로 나눌 수 있지만 루트 요소가 동일하기 때문에 하나의 파일로 유지하려고합니다).동일한 루트 요소에 대해 두 가지 유형을 생성하는 경우

이제 2 개의 다른 XML이 있습니다.

<orderStatus shipStatus="SHIPPED/PENDING"> 
    <orderId>1234</orderId> 
    <orderedBy>userName</orderedBy> 
    <orderedOn>2012-07-23T11:35:51.000-04:00</orderedOn> 
</orderStatus> 

두 번째 XML 내가이 2 XMLS 1 XSD를 할 수있는 방법

<orderStatus modifyShipStatus="SUSPENDED/PENDING"> 
    <shipStatus>101</shipStatus> 
</orderStatus> 

입니까? 하나의 유형으로 루트 요소를 만들려고했지만 제대로 작동하지만 다른 유형을 추가하려고하면 JAXB에서 요소가 이미 정의되었다는 오류가 발생합니다. 센스를 만든다.

답변

2

답변은 부분적으로 정확히 말하고 싶은 부분과 사용중인 스키마 언어에 부분적으로 달려 있습니다. DTD? XSD 1.0? XSD 1.1? RelaxNG? 다른 ...? 아, 맞습니다. 질문에 XSD라는 태그가 붙어 있으므로 XSD 솔루션을 찾고 있다고 가정합니다.

당신은 orderStatus 요소가있을 수 있다는 것을 말하고 싶은 경우 orderId, orderedBy, 또는 orderedOn또는 아이들과 같은 순서 shipStatus, 그리고 속성 shipStatusmodifyShipStatus는 선택적입니다, 다음에 그렇게 말하는 순서 콘텐츠 모델은 간단합니다.

<!ELEMENT orderStatus ((orderId, orderedBy, orderedOn) | shipStatus) > 
<!ATTLIST orderStatus 
      shipStatus CDATA #IMPLIED 
      modifyShipStatus CDATA #IMPLIED 
> 

또는 XSD 표기법

,
<xs:element name="orderStatus" type="my:orderStatus"/> 
<xs:complexType name="orderStatus"> 
    <xs:choice> 
    <xs:sequence> 
     <xs:element ref="my:orderId"/> 
     <xs:element ref="my:orderedBy"/> 
     <xs:element ref="my:orderedOn"/> 
    </xs:sequence> 
    <xs:element ref="my:shipStatus"/> 
    </xs:choice> 
    <xs:attribute name="shipStatus"/> 
    <xs:attribute name="modifyShipStatus"/> 
</xs:complexType> 

그런 다음이 완료 쓰기 : 당신이 쓰는 것 (나는 그것의 소형 여기 사용) DTD의 표기법에서

.

두 속성 중 하나만 허용하거나 합법적 인 하위가 하나 또는 다른 속성이 있는지 여부에 의존하려면 상황이 더 복잡합니다. (일부 문서 설계자는 원하는 경우 두 개의 매우 다른 요소 유형을 사용하여 동일 이름으로 호출해야하므로 유효성 검사가 불필요하게 어려워집니다.)

이 경우 선택 항목은 다음과 같습니다.

  • 는 상술 한 바와 같이 DTD 및/또는 XSD 1.0 스키마를 사용하여 표현 추가적인 제약 조건을 문서에서, 또는 스키마 트론을 사용하거나 다른 방법에 의해.

  • 사용 XSD 1.1, 컨텐츠 모델을 정의하고 전술 한 바와 같이, 속성,

    • 정확히 속성 shipStatus 중 하나 modifyShipStatus 표시해야한다는 말을 주장을 추가합니다.
    • orderId이라는 하위가 나타나는 경우에만 shipStatus 속성이 나타나야합니다.
    • modifyShipStatus이라는 이름의 자식이 나타나는 경우에만 modifyShipStatus이 나타나야합니다.
  • XSD 1을 사용하십시오.

    <xs:complexType name="orderStatus1"> 
         <xs:sequence> 
         <xs:element ref="my:orderId"/> 
         <xs:element ref="my:orderedBy"/> 
         <xs:element ref="my:orderedOn"/> 
         </xs:sequence> 
         <xs:attribute name="shipStatus"/> 
        </xs:complexType> 
        <xs:complexType name="orderStatus2"> 
         <xs:element ref="my:shipStatus"/> 
         <xs:attribute name="modifyShipStatus"/> 
        </xs:complexType> 
    
        <xs:element name="orderStatus"> 
         <xs:alternative test="@shipStatus" type="my:orderStatus1"/> 
         <xs:alternative test="@modifyShipStatus" type="my:orderStatus2"/> 
        </xs:element> 
    
    • I :

    XSD를이 같이 보일 것입니다 : 때 1, orderStatus 요소의 두 가지 형태의 두 가지 유형을 정의하고 적용되는 유형의 말을 조건 유형 지정을 사용 그 매니아들은 종종 Relax NG의 힘을이 강점의 하나로 강요하는 것을 인용합니다.

관련 문제