如何定义XSD元素有多个子元素,所有子元素都很简单,只有属性?

时间:2012-09-29 21:09:05

标签: xml xsd

我正在尝试定义我的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>定义一大堆孩子,这些孩子都很简单,没有孩子,只有属性?提前谢谢!

1 个答案:

答案 0 :(得分:3)

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

错误是您不能将命名类型嵌套在除xs:schemaxs: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>

您可能遇到的问题与使用xs:all而不是xs:sequencexs:choice有关。在XSD 1.0中,xs:all非常挑剔,因为timing元素不能出现多次。

下面的XSD是由工具生成的。它使用序列合成器(而不是所有),这将允许我添加的变化(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>