2010-12-12 4 views
2

XML 스키마가 있고 여러 노드에서 일부 확장을 지원한다고 가정합니다. 확장은 이러한 노드 내에서 유효한 XML이어야합니다.알 수없는 요소가있는 XML 확장

나는 < 스키마에서 > 요소로 구현 될 수 있음을 알고 있습니다. 그러나 내 XML 스키마에서 내 스키마를 사용하려면 다른 XSD의 노드 만 사용하면됩니다. 따라서 런타임에 확장의 스키마를 지정하고 확장 스키마에 대해이 확장의 유효성을 검사 할 수 있습니다.


<xs:element name="notes" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="http://www.w3.org/1999/xhtml" 
      minOccurs="0" maxOccurs="unbounded" 
      processContents="skip"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

가 지금은 (초보자 I'am) 예를 들어 내 XML이 스키마를 지정하려면,이 같은 :


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="myschema.xsd"> 
    <bar> 
    <extension> 
     <html namespace="http://www.w3.org/1999/xhtml"> 
     <body>Hello, World!</body> 
     </html> 
    </extension> 
    </bar> 
</foo> 

다음 예제는 정적 확장 스키마를 사용

가장 좋은 방법은 무엇입니까? 이상 적으로 필자는 필자가 XML의 확장 노드에서 사용하는 스키마 목록을 내 XML에 포함하려고합니다.

감사합니다!

== 편집, 자세한 설명 : ==

나는 특정 노드에서 사용자 정의 XML 데이터를 지원하고자합니다. 내 "마스터"스키마를 작성하는 동안 이러한 확장 스키마를 알지 못합니다.

내 XSD의 다음 조각 지정한 :


<xs:element name="extension"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:any namespace="##other" processContents="strict"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

을 다음과 같은 XML 사용하려면 : < body2가 유효하지 않기 때문에


<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd" > 
    <bar> 
     <extension> 
      <html xmlns="http://www.w3.org/1999/xhtml"> 
       <body2>Hello, world!</body2> 
      </html> 
     </extension> 
    </bar> 
</foo> 

지금 내가 파서 오류 싶어를 XHTML 요소. 그러나 XMLSpy 파서는 이미 유효하지 않은 < html> 요소에 대해 불평하고 있습니다.

+0

나는 실수를 볼 수 없다! XMLSpy는 어리 석고 네임 스페이스를 바꾸지 않을 수 있습니다. 그러나 ... body2 그 시점에서 잘못된 요소입니다! 시체를 가져 가면 어떡하지? –

+0

내 편집을 참조하십시오. XMLSpy는 html 요소를 거부하는 것이 옳습니다. 스키마를 가져올 위치를 지정하지 않았습니다. –

답변

0

사용 "엄격한"처리 프로세서가 스키마를 얻을 가능성이없는 때문에 모든 요소의 내용이 다음 실패 즉

<xs:element name="notes" minOccurs="0"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:any namespace="http://www.w3.org/1999/xhtml" 
      minOccurs="0" maxOccurs="unbounded" 
      processContents="strict"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

검증 문서의 그 스키마에 대해 유효성을 검사하는 것이 의무화하기 XHTML 용. 당신과 같이, 또한 인스턴스 문서에서이를 지정해야합니다 :

<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="test.xsd"> 
<extension> 
    <html xmlns="http://www.w3.org/1999/xhtml" 
    xsi:schemaLocation="http://www.w3.org/1999/xhtml 
         http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd"> 
    <body2>Hello, world!</body2> 
    </html> 
</extension> 
</foo> 

지금, 많은 XSD 유효성 검사기는 여전히 질식 것입니다, 그들은 html 요소의 schemaLocation 속성을 고려하지 않기 때문에 (비록 그들이 해야지 to, per spec). schemaLocation 속성을 루트 요소로 이동하면 항목을 향상시킬 수 있습니다 (또는하지 않을 수도 있음) : 유효성 검사기가 html 요소에 대해 불만을 제기하면 오류가 발생합니다.

+0

Martin 감사합니다. 어쩌면 나는 내 질문에 충분히 명확하지 못했다 (또는 나는 그 해답을 이해하지 못한다). 내 "마스터"스키마에서 확장 스키마를 모르므로 첫 번째 조각과 같이 해당 스키마를 정적으로 정의 할 수 없습니다. 제 시작 부분에 추가되었습니다. 다시 한 번 감사드립니다! – eiri

+0

우수! 예, 이제 저는 무엇이 잘못되었는지 이해합니다.많은 도움을 주셔서 감사합니다. – eiri