2017-01-23 6 views
0

프로젝트의 기존 XML 파일의 유효성을 검사하려고합니다.고유 한 입자 오류가 발생하여 임의의 순서로 여러 자식 요소를 허용하려고합니다.

<resources> 
    <file name="one" path="C:\test\one.txt" /> 
    <cache path="C:\test\cache\" /> 
    <file name="two" path="C:\test\two.txt" /> 
    <bundle name="myFolder"> 
     <file name="three" path="C:\test\three.txt" /> 
     <file name="four" path="C:\test\four.txt" /> 
    </bundle> 
    <file name="one" path="C:\test\one.txt" /> 
    <bundle name="myFolder"> 
     <file name="three" path="C:\test\three.txt" /> 
     <file name="four" path="C:\test\four.txt" /> 
    </bundle> 
    <file name="one" path="C:\test\one.txt" /> 
</resources> 

가, 내가 원하는 것은 가장 한 cache 요소에서 아이들에게

  • 을 가지고 루트 요소 resources와 구조가 어떤 순서
  • 임의의 수에 : 같은 예 구조가 보인다 순서
  • bundlefilebundle 요소들의 file 요소
  • 임의의 개수를 포함 17,451,515,

이 (this answer에서 그리기) 내 현재 XSD입니다 :

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="cache"> 
     <xs:attribute name="path" type="xs:string" /> 
    </xs:complexType> 

    <xs:complexType name="file"> 
     <xs:attribute name="name" type="xs:string" /> 
     <xs:attribute name="path" type="xs:string" /> 
    </xs:complexType> 

    <xs:complexType name="bundle"> 
     <xs:choice maxOccurs="unbounded"> 
      <xs:element name="file" type="file" maxOccurs="unbounded" /> 
     </xs:choice> 
     <xs:attribute name="type" /> 
     <xs:attribute name="name" /> 
    </xs:complexType> 

    <xs:group name="unboundednoncache"> 
     <xs:choice> 
      <xs:element name="file" type="file" /> 
      <xs:element name="bundle" type="bundle" /> 
     </xs:choice> 
    </xs:group> 

    <xs:element name="resources"> 
     <xs:complexType> 
      <xs:sequence> 
       <!-- Validates if this next line is removed, 
       and the cache element is moved to first --> 
       <xs:group ref="unboundednoncache" minOccurs="0" maxOccurs="unbounded" /> 
       <xs:element name="cache" type="cache" minOccurs="0" maxOccurs="1" /> 
       <xs:group ref="unboundednoncache" minOccurs="0" maxOccurs="unbounded" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

이 나에게 오류를 제공합니다

Cos-nonambig: File And File (or Elements From Their Substitution Group) Violate "Unique Particle Attribution". During Validation Against This Schema, Ambiguity Would Be Created For Those Two Particles.

내가 처음 <xs:group>를 제거하면 내가 확인하는 최초의 XSD를 얻을 수 있습니다 XSD에서 cache 요소를 XML의 첫 번째 하위 항목으로 이동 시키되 캐시 요소를 아무 곳에서나 유효하게 만들고 싶습니다.

(이전 버전에 내가 사용 하였다. 나도 원하지 않는 다수의 캐시 요소를

<xs:choice maxOccurs="unbounded"> 
    <xs:element name="cache" type="cache" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="file" type="file" minOccurs="0" maxOccurs="unbounded" /> 
    <xs:element name="bundle" type="bundle" minOccurs="0" maxOccurs="unbounded" /> 
</xs:choice> 

..하지만 그 수)

왜 내 XSD 위반 않는다 "독특한 입자 기여도 "를 수정하려면 어떻게해야합니까? 스키마 문서에서

답변

2

, 당신은

((file | bundle)*, cache?, (file | bundle)*) 

이 의미 올바른지의 동등 resources의 컨텐츠 모델을 작성했지만, 초기 file 요소 중 하나 file의 두 번째 발생에서의 첫 번째 일치 수 컨텐츠 모델 가장 잘 보이지 않는 이유로 XSD에서 허용하지 않습니다.

따라서 결정적인 동등한 콘텐츠 모델이 필요합니다. 모든 비 결정적 내용 모델은 결정 론적 등가물을 가지고 있지만 당신을 수행합니다

<xs:group name="cache-plus-noncache"> 
    <xs:sequence> 
    <xs:element name="cache" type="cache" 
       minOccurs="1" maxOccurs="1" /> 
    <xs:group ref="unboundednoncache" 
       minOccurs="0" maxOccurs="unbounded" /> 
    </xs:sequence> 
</xs:group> 

<xs:element name="resources"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:group ref="unboundednoncache" 
       minOccurs="0" maxOccurs="unbounded" /> 
     <xs:group ref="cache-plus-noncache" 
       minOccurs="0" maxOccurs="1" /> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

도구를 가지고 편리 할 수 ​​있습니다 (unboundednoncache의 당신의 정의를 재사용) XSD 구문,

((file | bundle)*, (cache, (file | bundle)*)?) 

또는 결정론에 대한 위반 (일명 '고유 한 입자 속성') 규칙을 감지하고 결정론적인 동등성을 제안하거나 콘텐츠 모델에 결정적인 동등성이 없다는 나쁜 소식을 부른 사람은 콘텐츠 모델을 읽습니다. 이 이론은 Anne Brüggemann-Klein이 깔끔하게 정리했습니다. 그러나 지금까지는 그러한 도구에 대해 알지 못하고 있으며, 필자의 정기 결의안은 아직까지 열매를 맺지 못했습니다.