我正在尝试定义我的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>
定义一大堆孩子,这些孩子都很简单,没有孩子,只有属性?提前谢谢!
答案 0 :(得分:3)
由于您似乎在学习XSD,因此构建更完整的XML示例可能更容易,然后使用某种工具从所有这些示例XML生成XSD。从生成的XSD中你可以学到很多东西,它应该让你更容易逐步改变它以更好地适应你的目标。
错误是您不能将命名类型嵌套在除xs:schema
或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>
您可能遇到的问题与使用xs:all
而不是xs:sequence
或xs: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>