将XSD方案拆分为多个文件

时间:2013-11-01 12:49:46

标签: xml xsd xerces

我尝试为计算机游戏的地图数据构建以下一组XSD方案:

  1. CreatureDefinitionsSchema.xsd
  2. CreatureSchema.xsd
  3. GoalList.xsd
  4. LightScheme.xsd
  5. RoomScheme.xsd
  6. SeatScheme.xsd
  7. TrapScheme.xsd
  8. 中心是MapDefinitionSchema.xsd架构,它应该引用其他架构。 我没有遇到这样的例子,但一般的想法是创建补充集

    1. CreatureDefinitionsSchema.xml
    2. CreatureSchema.xml
    3. GoalList.xml
    4. LightScheme.xml
    5. RoomScheme.xml
    6. SeatScheme.xml
    7. TrapScheme.xml
    8. 使用xsd:import在MapDefinition.xml中使用它。 我想要的是能够针对MapDefinitionScheme.xsd验证MapDefinition.xml 和其他x .x文件对抗* .xsd对应的文件。

      但是我看到我管理xs:从其他xsd导入类型(不是我想要的)。我想要的更像是:

      <xs:element name="GameMap">
          <xs:complexType>
              <xs:sequence>
                  <xs:element name="MapSizeX">  </xs:element >
                  <xs:element name="MapSizeY">  </xs:element >                
                  <xs:include xmlns:xi="http://www.w3.org/2001/XInclude" href="SeatScheme.xsd" />
              </xs:sequence>           
      
          </xs:complexType>
      

      ,但我得到

        
          

      引擎名称:Xerces     严重性:错误     描述:s4s-elt-must-match.1:'sequence'的内容必须匹配(注释?,(element | group | choice | sequence | any)*)。从以下问题开始发现问题:include。     开始地点:9:18     结束地点:9:28&lt;&lt;

        

      似乎我无法随意包含这些元素。

        

      我的SeatScheme.xsd:

           

      <xs:element name="SeatList" type="Seat"/>        
          <xs:complexType name="Seat">
          <xs:sequence>
              <xs:element name="color" type="xs:string"/>
              <xs:element name="faction" type="xs:string"/>
              <xs:element name="startingX" type="xs:integer"/>
              <xs:element name="startingY" type="xs:integer"/>
              <xs:element name="colorR" type="xs:decimal"/>            
              <xs:element name="colorG" type="xs:decimal"/>
              <xs:element name="colorB" type="xs:decimal"/>            
          </xs:sequence>
      </xs:complexType> </xs:schema>
      

      这是否可行,不是在类型上运行,而是在元素上运行?

1 个答案:

答案 0 :(得分:1)

您似乎混淆了XInclude,它在任意位置对引用文件进行文本包含(以及树,嫁接),以及XSD的包含和导入声明,它们只能在顶层操作(即, xs:schema元素的子元素。您已在xs:include元素中声明了XInclude命名空间,这非常令人困惑。

您可以使用XInclude来构建架构文档,就像使用它来构建任何其他XML文档一样,但这不是通常的方法。通常的方法是使用xs:include(如果定义在同一名称空间中)或xs:import(如果它们位于不同的名称空间中)。如果你想在结构的中间包含一些东西,那么这样做的方法是(a)在顶层,包括一个定义一个命名模型组的模式文档(xs:group name =“n”),和( b)在您想要包含该组的位置,将其包含在模型组引用中:<xs:group ref="n"/>