문제

이미 사용 중인 XML 형식에 대한 스키마를 만들어야 합니다.기존 XML은 이미 다른 프로그램에서 생성되고 있어, 좀 더 일반적인 XML 형식을 사용하기 위해 변경해야 할 부분을 모두 추적하기는 어려울 것 같습니다.

다음은 XML 구조와 유사한 예입니다.

<data>
    <summary>some info</summary>
    <error>error message (only if there was an error)</error>
    <details>more info
        <x>more</x>
        <y>even more</y>
    </details>
    <error>another error message</error>
    <z>some extra info</z>
</data>

오류 태그는 ​​동일한 수준에서 재사용되며 특정 항목 뒤에 오지만 다른 항목 뒤에는 오지 않으므로 maxOccurs="unbounded"로 설정할 수는 없습니다.xsd:sequence에서 관련된 오류/기타 태그 쌍을 래핑하려고 시도했지만 여전히 고유 입자 속성 규칙을 효과적으로 위반하고 있기 때문에 효과가 없습니다.

이 작업을 수행할 수 있습니까? 아니면 다른 개발자에게 이 스키마가 유효성을 검사하지 않는다는 사실을 알려야 합니까?

도움이 되었습니까?

해결책

나의 독서는 XML 스키마 표준 당신은 아마 안전할 거라고 하더군요.생성될(또는 생성될 수 있는) XML을 반영하기 위해 스키마에서 동일한 이름을 가진 비연속적인 요소를 정의하기만 하면 됩니다.모든 "오류" 인스턴스가 언제나 다른 요소로 분리되어 있고 연속적이지 않은 경우 이는 문제가 되지 않습니다.예를 들어 다음과 같습니다.

  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" />
        <xs:element ref="error" minOccurs="1" maxOccurs="1" />
        <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:element name="error" type="xs:string"/>

  <xs:complexType name="detailsType">
    ....
  </xs:complexType>

세부사항에 minOccurs="0"이 있고 위의 첫 번째 "오류"에 maxOccurs > 1이 있는 경우 유효성 검사를 확인할 수 없기 때문에 연속된 두 개의 오류 요소가 있는 경우 "오류"의 인스턴스가 무엇인지 확인할 수 없기 때문에 고유 입자 속성 규칙에 실패합니다. " 그들이 속한 스키마에서.그러나 오류 요소와 중간 요소에 대해 "minOccurs" 및 "maxOccurs"를 적절히 사용하여 "오류"의 각 인스턴스를 스키마에서 고유하게 식별할 수 있는 한 괜찮습니다.

예를 들어 스키마 유효성 검사기가 minOccurs 및 maxOccurs를 사용하여 어떤 인스턴스가 참조되고 있는지 명확하게 파악할 수 있는 한 연속적인 "오류" 인스턴스가 있을 수도 있습니다.

임의의 반복을 통해 요소가 임의의 순서로 나타날 수 있는 xhtml을 생각해 보세요.

편집하다:원래 질문의 수정 사항을 반영하도록 업데이트되었습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top