【问题标题】:Splitting XSD scheme into several files将 XSD 方案拆分为多个文件
【发布时间】:2013-11-01 12:49:45
【问题描述】:

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

  1. CreatureDefinitionsSchema.xsd
  2. CreatureSchema.xsd
  3. 目标列表.xsd
  4. LightScheme.xsd
  5. RoomScheme.xsd
  6. SeatScheme.xsd
  7. TrapScheme.xsd

中心是 MapDefinitionSchema.xsd 模式,它应该引用其他模式。 我还没有遇到过这样的例子,但总体思路是创建互补集

  1. CreatureDefinitionsSchema.xml
  2. CreatureSchema.xml
  3. 目标列表.xml
  4. LightScheme.xml
  5. RoomScheme.xml
  6. SeatScheme.xml
  7. TrapScheme.xml

并在 MapDefinition.xml 中使用 xsd:import 。 我想要的是能够针对 MapDefinitionScheme.xsd 验证 MapDefinition.xml 和其他 xml 文件针对它们的 *.xsd 对应文件。

但是我看到我设法 xs:import types from other xsd (not what I want) 。我想要的更像:

<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'的内容必须匹配(注解?,(元素|组|选择|序列|任何)*)。发现一个问题开始于:包括。 开始地点:9:18 结束地点:9:28

似乎我不能随意包含这些元素。

我的 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>

这是否可行,不是对类型而是对元素进行操作?

【问题讨论】:

    标签: xml xsd xerces


    【解决方案1】:

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

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

    【讨论】:

    • 这是一半!,基本上我想在单独的 xsd 文件中定义每个 以便我以后可以针对它验证 XML(仅包含游戏数据的某些部分!)。 不能包含元素(注解?,(全部 | 选择 | 序列))
    • 啊,我没有注意到我可以将元素包装在上述容器之一中,而不是放入组中...... :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多