2013-08-29 4 views
1

나는 (합리적으로) 간단한 XML과 해당 스키마 파일을 가지고있다. 다른 하나에 대해 유효성 검사를 시도하면 netbeans가 다음 오류 메시지를 내뿜습니다.이 XML이 유효하지 않은 이유는 무엇입니까?

문서 유형 선언에 포함되거나 지적 된 마크 업 선언은 올바른 형식이어야합니다. [2]

이것은 내 스키마 파일 자체가 잘 형성되지 않았 음을 나타냅니다. 그러나 내 스키마 파일의 유효성을 검사 할 때 오류가 없습니다. 누구든지 내 실수를 발견 할 수 있습니까 (그렇지 않으면 내가 이해하지 못하는 것에 관해서 나를 교육하십시오)?

XML :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE map SYSTEM "maps.xsd"> 
<map xmlns="http://example.com/sample" id="testMap" name="Test Map"> 
    <transferRoom id="start" name="Start" posX="0" posY="0"> 
     <type>transfer</type> 
     <description>The starting room for the game.</description> 
     <transferID>testMap.testingGrounds</transferID> 
     <passageNorth>false</passageNorth> 
     <passageEast>false</passageEast> 
     <passageSouth>true</passageSouth> 
     <passageWest>false</passageWest> 
    </transferRoom> 
</map> 

및 XSD (라고 maps.xsd) :

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://example.com/sample" elementFormDefault="qualified"> 
    <xs:element name="map"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element minOccurs="1" maxOccurs="unbounded" ref="transferRoom"/> 
       <xs:element maxOccurs="unbounded" ref="room"/> 
      </xs:sequence> 
      <xs:attribute name="name" use="required"/> 
      <xs:attribute name="id" use="required" type="xs:ID"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="transferRoom"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="type"/> 
       <xs:element ref="description"/> 
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="container"/> 
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="enemy"/> 
       <xs:element ref="transferID"/> 
       <xs:element ref="passageNorth"/> 
       <xs:element ref="passageEast"/> 
       <xs:element ref="passageSouth"/> 
       <xs:element ref="passageWest"/> 
      </xs:sequence> 
      <xs:attribute name="name" use="required"/> 
      <xs:attribute name="id" use="required" type="xs:ID"/> 
      <xs:attribute name="posX" use="required"/> 
      <xs:attribute name="posY" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="type" type="xs:string"/> 
    <xs:element name="description" type="xs:string"/> 
    <xs:element name="container"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="name"/> 
       <xs:element ref="description"/> 
       <xs:element ref="level"/> 
      </xs:sequence> 
      <xs:attribute name="locked" default="false"> 
       <xs:simpleType> 
        <xs:restriction base="xs:token"> 
         <xs:enumeration value="true"/> 
         <xs:enumeration value="false"/> 
        </xs:restriction> 
       </xs:simpleType> 
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="name" type="xs:string"/> 
    <xs:element name="enemy"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="type"/> 
       <xs:element ref="description"/> 
       <xs:element ref="level"/> 
      </xs:sequence> 
      <xs:attribute name="name" use="required"/> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="level" type="xs:string"/> 
    <xs:element name="transferID" type="xs:string"/> 
    <xs:element name="passageNorth" type="xs:boolean"/> 
    <xs:element name="passageEast" type="xs:boolean"/> 
    <xs:element name="passageSouth" type="xs:boolean"/> 
    <xs:element name="passageWest" type="xs:boolean"/> 
    <xs:element name="room"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="type"/> 
       <xs:element ref="description"/> 
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="container"/> 
       <xs:element minOccurs="0" maxOccurs="unbounded" ref="enemy"/> 
       <xs:element ref="passageNorth"/> 
       <xs:element ref="passageEast"/> 
       <xs:element ref="passageSouth"/> 
       <xs:element ref="passageWest"/> 
      </xs:sequence> 
      <xs:attribute name="name" use="required"/> 
      <xs:attribute name="id" use="required" type="xs:ID"/> 
      <xs:attribute name="posX" use="required"/> 
      <xs:attribute name="posY" use="required"/> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

나는 XML 다소 새로운 오전. 일반적인 구문과 기능에 익숙하지만 헤더 섹션은 매우 혼란 스럽습니다.

답변

3

doctype 요소는 XSD가 아닌 DTD와 연결하는 데 사용됩니다.

대신 xsi:schemaLocation="maps.xsd"을 루트 요소에 사용하십시오.

+0

을 즉 실제로 에러 메시지를 돌봐 동안, 나는 지금 없다는, 또 하나 인사를하고 : cvc-elt.1 : 'map'요소의 선언을 찾을 수 없습니다. [2] :/ – maxf130

+0

새 오류 메시지는 별개의 문제이며 별도의 질문입니다. (당신은 네임 스페이스에 문제가있다 : 당신의 인스턴스 요소는 네임 스페이스가 한정적이지만 스키마는 네임 스페이스의 컴포넌트를 선언하지 않고'targetNamespace' 속성을 사용한다.)보다 일반적으로, XSD 튜토리얼을 검토해야 할 수도있다. –

+0

@ C.M.Sperberg-McQueen <- This. 안타깝게도 대부분의 자습서는 요소, 속성 등을 정의하는 방법에 초점을 맞추고 네임 스페이스 정의 등을 고찰하는 것처럼 보입니다. – maxf130

2

더 정확하게,이 같은 스키마를 표시 XSI 네임 스페이스를 선언 한 다음 사용

<?xml version="1.0" encoding="UTF-8"?> 
<map xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://example.com/sample" id="testMap" name="Test Map"  
    xsi:schemaLocation="maps.xsd"> 
... 
관련 문제