1

我正在尝试定义我的 XSD 的一部分,其中以下 XML 将是有效的:

<machine>
    <timing offset="3s" period="20s"/>

    <!-- <machine> actually has many child elements, all of them are like <timing>
         and only have attributes -->
</machine>

这是我到目前为止所拥有的:

<xs:element name="machine">
    <xs:complexType>
        <xs:all>
            <!-- Definition for the <timing> child element. -->
            <xs:element name="timing" type="timing_type"/>
            <xs:complexType name="timing_type">
                <xs:attribute name="offset" type="xs:string"/>
                <xs:attribute name="period" type="xs:string"/>
            </xs:complexType>

            <!-- Definitions for the other <machine> child elements... -->
        </xs:all>
    </xd:complexType>
</xs:element>

在读取的行上<xs:complexType name="timing_type">,我收到以下错误消息:

解析组件“timing_type”时出错。检测到“timing_type”位于命名空间“http://www.w3.org/2001/XMLSchema”中,但该命名空间中的组件无法从架构文档“file:////mySchema.xsd”中引用。如果这是不正确的命名空间,则可能需要更改“timing_type”的前缀。如果这是正确的命名空间,则应将适当的“import”标记添加到“file:////mySchema.xsd”。

有什么想法我在这里做错了吗?我如何定义一大堆孩子,<machine>因为它们都很简单,没有孩子,只有属性?提前致谢!

4

1 回答 1

3

由于您似乎正在学习 XSD,因此构建更完整的 XML 示例可能更容易,然后使用一些工具从所有这些示例 XML 生成 XSD。从生成的 XSD 中,您可以学到很多东西,并且它应该使您更容易逐步更改它以更好地适应您的目标。

错误是您不能将命名类型嵌套在除 anxs:schema或 an之外的任何内容下xs:redefine

因此,如果您如下所示,您的剪断将是正确的:

<?xml version="1.0" encoding="utf-8" ?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="machine">
        <xs:complexType>
            <xs:all>
                <!-- Definition for the <timing> child element. -->
                <xs:element name="timing" type="timing_type"/>
                <!-- Definitions for the other <machine> child elements... -->
            </xs:all>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="timing_type">
        <xs:attribute name="offset" type="xs:string"/>
        <xs:attribute name="period" type="xs:string"/>
    </xs:complexType>
</xs:schema>

您可能遇到的问题与使用 ofxs:all代替xs:sequenceor相关xs:choice。在 XSD 1.0 中,这是非常挑剔的,因为元素xs:all的出现次数不能超过一次。timing

下面的 XSD 是由工具生成的。它使用一个序列合成器(而不是all),这将允许我添加的变化(maxOccurs="unbounded")

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="machine">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="timing" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:attribute name="offset" type="xsd:string" use="required" />
            <xsd:attribute name="period" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

如果您将另一种类型的元素添加到混合中(如您所建议的那样),并且您希望允许任意数量的此类元素,以任何顺序单独出现不止一次,那么下面的模型将起作用。这里要注意的是xsd:choice maxOccurs="unbounded"

<?xml version="1.0" encoding="utf-8"?>
<!--XML Schema generated by QTAssistant/XML Schema Refactoring (XSR) Module (http://www.paschidev.com)-->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="machine">
    <xsd:complexType>
      <xsd:choice maxOccurs="unbounded">
        <xsd:element name="timing">
          <xsd:complexType>
            <xsd:attribute name="offset" type="xsd:string" use="required" />
            <xsd:attribute name="period" type="xsd:string" use="required" />
          </xsd:complexType>
        </xsd:element>
        <xsd:element name="cycle">
          <xsd:complexType>
            <xsd:attribute name="duration" type="xsd:positiveInteger" use="required" />
            <xsd:attribute name="period" type="xsd:positiveInteger" use="required" />
          </xsd:complexType>
        </xsd:element>          
      </xsd:choice>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
于 2012-09-29T22:06:57.320 回答