2011-05-15 4 views
4

엘리먼트의 이름이 무엇인지 알 수는 없지만 아이의 모습을 알 수 있습니다. 예를 들어 "foo"및 "bar"는 지정되지 않지만 "A", "B"는 & "C"입니다.XSD가 와일드 카드 복합 유형을 정의 할 수 있습니까?

<example> 
    <foo> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
    </foo> 
    <bar> 
     <A>A</A> 
     <B>B</B> 
     <C>C</C> 
    </bar> 
</example> 

위반 사항이므로 name 속성을 그대로 둘 수 없습니다. 내가 대신이 작업을 수행 할 수 있기를 기대합니다 :이 중 하나가 작동하지 않습니다

<xs:element name="example"> 
    <xs:complexType> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:any> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="A" type="xs:string"/> 
         <xs:element name="B" type="xs:string"/> 
         <xs:element name="C" type="xs:string"/> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:any> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

, <xs:any>에만 주석을 포함하고 유형을 거부 할 수 있습니다.

알 수없는 요소 이름을 사용할 수있는 네임 스페이스로 수행 할 수있는 작업이 있습니까? 포기해야합니까, 아이들을 검증하지 말고 그 내용이 무엇인지 반드시 기록하십시오.

답변

0

XML 스키마에서 수행하려는 작업을 수행 할 수 없습니다. 가까운 해결책이 있지만 원하는 것은 아닙니다.

<xs:element name="example"> 
    <xs:complexType> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:any namespace="##other" processContents="lax"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

이제는 거기에 발생할 수있는 요소에 대해 별도의 스키마를 제공 할 수 있습니다. 별도의 네임 스페이스에서 별도의 스키마 파일에 foo 하나, :

에 대해 당신이 할 수있는 모든 (그건 당신의 "여러 네임 스페이스"솔루션)의
<xs:element name="foo"> 
    <xs:complexType> 
     .... 
    </xs:complexType> 
</xs:element> 

. 요소를 완전히 나열하는 것을 피할 수는 없습니다.

<xs:element name="example"> 
    <xs:sequence> 
    <xs:element ref="ABCSequence" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
</xs:element> 

<xs:element name="ABCSequence" abstract="true" type="ABCSeq" /> 
<xs:complexType name="ABCSeq"> 
    <xs:complexContent> 
    <xs:sequence> 
     <xs:element name="A" type="xsd:string" /> 
     <xs:element name="B" type="xsd:string" /> 
     <xs:element name="C" type="xsd:string" /> 
    </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="foo" substitutionGroup="ABCSequence" type="ABCSeq" /> 
<xs:element name="bar" substitutionGroup="ABCSequence" type="ABCSeq" /> 

나 ': 그 skip-processContents 세트로 다음 <xsd:any>, 충분하지 있다면 당신은 substitution groups와 함께이 일을 시도 할 수

+0

외부 유효성 검사 만 내 나머지 옵션입니다. – clockworkgeek

3

외부 검증 (코드, 스키마 트론 등) 다음에 당신의 유일한 해결책이다 확실하지 않은 경우 임의의 외부 요소를 해당 형식을 선언하지 않고 (xsi:type 특성을 통해) 추가 할 수는 있지만 적어도 사용자가 수행하는 문서 종류를 설명 할 수는 있습니다.

+0

+1 깔끔한 트릭. 과거와 미래의 모든 개발자가 관련 XML을 대체 할 수 있다면이 답변이이긴 것이지만 불행히도 불가능합니다. – clockworkgeek

+1

앞으로의 모든 개발자가 스키마를 준수하기를 원하면 잃어버린 배틀을 당할 것입니다. 나는 사람들이 XML이라고 부르는 것을 보았다. 나는 그들이 그것을 "파싱"하는 방법을 보았다. 신이여, 나는 그들이 한 일을 보아왔다.'xsi : type' 주석을 사용하고 _your_ 파서를 검증 모드에 두는 것은 아마도 유일한 희망이다. (Obi Wan에게 묻습니다.) –