xsd - 复杂类型之间的循环依赖
xsd - circular dependencies between complex types
我正在查看此处提供的一些 xsd 文件:https://www.isotc211.org/2005/gmd/
我在 https://www.isotc211.org/2005/gmd/citation.xsd
中看到了这个
<xs:complexType name="CI_Citation_Type">
<xs:complexContent>
<xs:extension base="gco:AbstractObject_Type">
<xs:sequence>
...
<xs:element name="identifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
...
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="CI_Citation" type="gmd:CI_Citation_Type"/>
<xs:complexType name="CI_Citation_PropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="gmd:CI_Citation"/>
</xs:sequence>
...
</xs:complexType>
这意味着
CI_Citation_PropertyType
包含 CI_Citation_Type
类型的序列项
- 和
CI_Citation_Type
包含 MD_Identifier_PropertyType
类型的序列项
另一方面,我在 https://www.isotc211.org/2005/gmd/referenceSystem.xsd
中看到了这个
<xs:complexType name="MD_Identifier_Type">
<xs:complexContent>
<xs:extension base="gco:AbstractObject_Type">
<xs:sequence>
<xs:element name="authority" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
...
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MD_Identifier" type="gmd:MD_Identifier_Type"/>
<xs:complexType name="MD_Identifier_PropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="gmd:MD_Identifier"/>
</xs:sequence>
<xs:attributeGroup ref="gco:ObjectReference"/>
<xs:attribute ref="gco:nilReason"/>
</xs:complexType>
这意味着
MD_Identifier_PropertyType
包含 MD_Identifier_Type
类型的序列项
- 和
MD_Identifier_Type
包含 CI_Citation_PropertyType
类型的序列项
所以
这看起来像是 xsd 类型 CI_Citation_PropertyType
和 MD_Identifier_PropertyType
之间的循环依赖。
我的问题:
这是valid/legalxsd吗?这样的 "circular dependencies" 是 xsd/xml 的问题吗? (我认为 xsd 模式接受循环引用)
我尝试为这些类型生成映射 类。我无法弄清楚如何处理这种依赖关系(在 C++ 中,#includes 是顺序的。可能通过前向声明和指针...)。
非常感谢
XSD 显然必须允许文档模型的递归结构,例如其中表格嵌套在表格中。因此,这样的结构是合法的也就不足为奇了。
我无法帮助你如何生成映射类,但像 C++ 这样的语言也允许递归数据结构。
我正在查看此处提供的一些 xsd 文件:https://www.isotc211.org/2005/gmd/
我在 https://www.isotc211.org/2005/gmd/citation.xsd
中看到了这个<xs:complexType name="CI_Citation_Type">
<xs:complexContent>
<xs:extension base="gco:AbstractObject_Type">
<xs:sequence>
...
<xs:element name="identifier" type="gmd:MD_Identifier_PropertyType" minOccurs="0" maxOccurs="unbounded"/>
...
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="CI_Citation" type="gmd:CI_Citation_Type"/>
<xs:complexType name="CI_Citation_PropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="gmd:CI_Citation"/>
</xs:sequence>
...
</xs:complexType>
这意味着
CI_Citation_PropertyType
包含CI_Citation_Type
类型的序列项
- 和
CI_Citation_Type
包含MD_Identifier_PropertyType
类型的序列项
另一方面,我在 https://www.isotc211.org/2005/gmd/referenceSystem.xsd
中看到了这个<xs:complexType name="MD_Identifier_Type">
<xs:complexContent>
<xs:extension base="gco:AbstractObject_Type">
<xs:sequence>
<xs:element name="authority" type="gmd:CI_Citation_PropertyType" minOccurs="0"/>
...
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="MD_Identifier" type="gmd:MD_Identifier_Type"/>
<xs:complexType name="MD_Identifier_PropertyType">
<xs:sequence minOccurs="0">
<xs:element ref="gmd:MD_Identifier"/>
</xs:sequence>
<xs:attributeGroup ref="gco:ObjectReference"/>
<xs:attribute ref="gco:nilReason"/>
</xs:complexType>
这意味着
MD_Identifier_PropertyType
包含MD_Identifier_Type
类型的序列项
- 和
MD_Identifier_Type
包含CI_Citation_PropertyType
类型的序列项
所以
这看起来像是 xsd 类型 CI_Citation_PropertyType
和 MD_Identifier_PropertyType
之间的循环依赖。
我的问题:
这是valid/legalxsd吗?这样的 "circular dependencies" 是 xsd/xml 的问题吗? (我认为 xsd 模式接受循环引用)
我尝试为这些类型生成映射 类。我无法弄清楚如何处理这种依赖关系(在 C++ 中,#includes 是顺序的。可能通过前向声明和指针...)。
非常感谢
XSD 显然必须允许文档模型的递归结构,例如其中表格嵌套在表格中。因此,这样的结构是合法的也就不足为奇了。
我无法帮助你如何生成映射类,但像 C++ 这样的语言也允许递归数据结构。