2013-08-29 115 views
1

我有一个(合理)简单的XML和相应的Schema文件。当我试图验证一个对另一个时,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元素用于与DTD关联,而不是XSD。

改为在根元素上使用xsi:schemaLocation="maps.xsd"

+0

虽然这确实照顾的错误消息,我现在正在迎接再一个,指出:cvc-elt.1:找不到元素'map'的声明。 [2]:/ – maxf130

+0

您的新错误消息是一个明显的问题和一个单独的问题。 (您有一个名称空间问题:您的实例元素是名称空间限定的,但您的模式不在该名称空间中声明组件;使用'targetNamespace'属性。)更一般地,您可能需要查看XSD教程。 –

+0

@ C.M.Sperberg-McQueen < - 这。可悲的是,大多数教程只关注如何定义元素,属性等,并似乎掩盖了命名空间定义等:/ – 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"> 
...