XML 스키마 - 고유 태그 제약 조건 해결
문제
이미 사용 중인 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을 생각해 보세요.
편집하다:원래 질문의 수정 사항을 반영하도록 업데이트되었습니다.