2016-12-19 8 views
1

고유 한 네임 스페이스를 사용하도록 기존 스키마를 업데이트하려고하므로 나중에 다른 스키마로 가져 와서 사용중인 유형이 가져온 스키마XSD 유효성 검사 : 루트 요소를 찾을 수없는 네임 스페이스

기본 및 대상 네임 스페이스를 변경하려고 시도했지만 스키마 유효성 검사로 인해 루트 노드가 손상되거나 숨겨졌습니다. 내가 볼 수있는 것부터 다른 네임 스페이스에 내 루트 요소를 숨겼지만 원하는 결과를 얻으려면 어떻게 구성해야하는지 확신 할 수 없습니다. 여기

내가

검증

XML

<Parent Id="P"> 
    <Child Id="C"/> 
</Parent> 

XSD에게

<xsd:schema targetNamespace="http://myNameSpace.com" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://myNameSpace.com" 
      elementFormDefault="qualified" > 

    <xsd:element name="Child"> 
     <xsd:complexType> 
     <xsd:attribute name="Id" /> 
     </xsd:complexType> 
    </xsd:element> 


    <xsd:element name="Parent"> 
     <xsd:complexType> 
     <xsd:sequence> 
      <xsd:element ref="Child" minOccurs="0"/> 
     </xsd:sequence> 
     <xsd:attribute name="Id" /> 
     </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

을 시도했다 기본적인 예입니다

유효하지 않습니다.

오류 - 줄 1, 19 : org.xml.sax.SAXParseException; lineNumber : 1; columnNumber : 19; cvc-elt.1 : 요소 ' '의 선언을 찾을 수 없습니다.

답변

1

: 당신이 접두사를 사용하려는 경우

<Parent Id="P" xmlns="http://myNameSpace.com"> 
    <Child Id="C"/> 
</Parent> 

또는 :

그래서, 당신의 XML은 같이해야한다

  • 실제로 대상에 지정된 네임 스페이스에 루트 요소를 배치하십시오. namesp XSD의 에이스 xmlns="http://myNameSpace.com"P에 추가합니다.
  • xsi:schemaLocation을 사용하여 으로 XSD에 대한 힌트를 제공하십시오 (선택 사항).

    • 네임 스페이스 접두사를 정의하고 Parent 선언에서 Child 선언을 참조하는 데 사용

    그리고 당신의 XSD-

  • .요청에 따라

    <?xml version="1.0" encoding="UTF-8"?> 
    <Parent Id="P" 
         xmlns="http://myNameSpace.com" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://myNameSpace.com try.xsd"> 
        <Child Id="C"/> 
    </Parent> 
    

    다음이 XSD에 대한 유효합니다 전부 다음

,이 XML,

<xsd:schema targetNamespace="http://myNameSpace.com" 
      xmlns:m="http://myNameSpace.com" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" > 

    <xsd:element name="Child"> 
    <xsd:complexType> 
     <xsd:attribute name="Id" /> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="Parent"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element ref="m:Child" minOccurs="0"/> 
     </xsd:sequence> 
     <xsd:attribute name="Id" /> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

.

+0

아 좋아, 네임 스페이스가 XML과 스키마에서 명시 적이어야한다는 것을 알지 못했습니다. 불행히도 나는 내가 바꿀 수있는 것에 의해 제한되어 있으며 XML을 변경할 수 없다. 이 같은 네임 스페이스를 사용할 수 있습니까? – Mark

+0

그렇습니다. XML 문서의 루트 요소의 네임 스페이스는 네임 스페이스가있는 XML의 유효성을 검사하는 데 사용할 XSD의 대상 네임 스페이스와 일치해야합니다. – kjhughes

+0

빠른 응답 주셔서 감사합니다! – Mark

0

XSD에 네임 스페이스가있는 경우 XML로 입력해야합니다. 당신은 당신의 XML에 몇 가지 변경을해야

<mysp:Parent Id="P" xmlns:mysp="http://myNameSpace.com"> 
    <mysp:Child Id="C"/> 
</mysp:Parent>