2010-04-14 7 views
0

XML 스키마에서 공유 정의를 가져 오려고하면 공유 형식을 제대로 참조 할 수 있지만 공유 요소를 참조하면 유효성 검사 오류가 발생합니다.XML 스키마 : 공유 요소를 가져올 때 네임 스페이스 문제 발생

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://shared.com" 
    targetNamespace="http://shared.com"> 

    <xs:element name="fooElement"> 
     <xs:simpleType> 
      <xs:restriction base="xs:integer"/> 
     </xs:simpleType> 
    </xs:element> 

    <xs:simpleType name="barType"> 
     <xs:restriction base="xs:integer"/> 
    </xs:simpleType> 

</xs:schema> 

지금이 XML 인스턴스를 고려하십시오

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema 
    elementFormDefault="qualified" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:shared="http://shared.com"> 

    <xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/> 

    <xs:element name="example"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="importedElement"/> 
       <xs:element ref="importedType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="importedElement"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="shared:fooElement"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

    <xs:element name="importedType"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="bar" type="shared:barType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

이 공유 정의 (shared.xsd)은 다음과 같습니다

공유 정의를 가져 스키마 (example.xsd)입니다 : 검증되면

<?xml version="1.0"?> 
<example 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:noNamespaceSchemaLocation="example.xsd"> 
    <importedElement> 
     <fooElement>42</fooElement> 
    </importedElement> 
    <importedType> 
     <bar>42</bar> 
    </importedType> 
</example> 

은 "importedType는"완벽하게 잘 작동하지만, "importedElement는"제공 의 다음과 같은 오류 :

Invalid content was found starting with element 'fooElement'. One of '{" http://shared.com ":fooElement}' is expected

나는 내 문제는 (따라서 어떻게 든 오해 "fooElement을 가지고 있지만 fooElement를 기다리고 있었다") 네임 스페이스 문제와 관련된 추측 것 - 여기에 무엇이 잘못되었는지에 대한 어떤 힌트? 그것이 더 네임 스페이스에있는 것처럼 당신은 fooElement를 참조하는

답변

0

, 당신은 인스턴스 문서에 올바른 네임 스페이스를 사용해야합니다

<?xml version="1.0"?> 
<example 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      
    xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com"> 
    <importedElement> 
     <shared:fooElement>42</shared:fooElement> 
    </importedElement> 
    <importedType> 
     <bar>42</bar> 
    </importedType> 
</example> 

편집 : 그 의 차이점이다 : 나는 지적한다 유형요소; 후자 만 문서에 나타나기 때문에 (일부 예외가 있음) 가져온 유형이 원하는대로 작동하고 요소가 작동하지 않습니다.

+0

내 질문에 답하기 때문에 답변을 수락했습니다. 불행히도, 그것은 내 문제를 해결하지 않습니다 : XML 인스턴스 문서는 고객에게 배포되며 변경할 수있는 옵션이 아닙니다. XML 인스턴스에서 조정이 필요하지 않은 공유 XSD *에서 요소 가져 오기를 허용하는 모든 네임 스페이스 - 마법? – netzwerg

+0

글쎄, 무엇 때문에 공유 스키마에 네임 스페이스를 할당하게 되었습니까? 거기에 어떤 명령이 있습니까? 공유 스키마에 메일과 같은 네임 스페이스가 없도록 설정하고 가져 오기 대신 include를 사용하는 것이 어떻습니까? – xcut

+0

나중에 JAXB를 사용하여 XML 문서에 액세스합니다. 가져 오기를 사용하면 공유 유형의 Java 대응 항목이 실제로 공유되지는 않지만 모든 XSD에 대해 다시 생성되므로 유틸리티 코드를 작성하는 것이 어려워집니다. – netzwerg