帮助自引用 XSD 生成循环引用
我正在尝试从 XSD 文件构建 C# 类。简而言之,我在尝试执行 XSD.exe 工具时遇到循环引用错误:
对“setFilterCondition”进行分组 targetNamespace='http://developer.cognos.com/schemas/report/7.0/' 有 无效定义:循环组引用。
我提取了该组的定义,并为其提供了以下 XSD:
<xs:group name="setFilterCondition">
<xs:annotation>
<xs:documentation>Represents a simple or compound set filter condition</xs:documentation>
</xs:annotation>
<xs:choice>
<xs:element name="setFilterAnd">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:group ref="setFilterCondition" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="setFilterOr">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:group ref="setFilterCondition" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="setFilterNot">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
<xs:complexType>
<xs:group ref="setFilterCondition"/>
</xs:complexType>
</xs:element>
<xs:element name="memberCaptionCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a condition against the member caption.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="contains">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_contains"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWith">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_beginsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWith">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_endsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matches">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_matches"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="containsNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_containsNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_beginsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_endsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matchesNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_matchesNot"/>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="stringPropertyCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a condition against a string member property. The value attribute must be provided for all operators except isNull and isNotNull.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element ref="dmMemberProperty"/>
</xs:all>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="contains">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_contains"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWith">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_beginsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWith">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_endsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matches">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_matches"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="containsNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_containsNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_beginsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_endsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matchesNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_matchesNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="isNull"/>
<xs:enumeration value="isNotNull"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="numericPropertyCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a numeric condition. The condition can be for either a tuple or a member property. The value attribute must be provided for all operators except isNull and isNotNull.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element ref="dmMemberProperty"/>
</xs:all>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="equal"/>
<xs:enumeration value="notEqual"/>
<xs:enumeration value="greaterThan"/>
<xs:enumeration value="greaterThanEqual"/>
<xs:enumeration value="lessThan"/>
<xs:enumeration value="lessThanEqual"/>
<xs:enumeration value="isNull"/>
<xs:enumeration value="isNotNull"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:decimal" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="tupleCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a numeric condition. The condition can be for either a tuple or a member property. The value attribute must be provided for all operators except isNull and isNotNull.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element ref="dmTuple"/>
</xs:all>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="equal"/>
<xs:enumeration value="notEqual"/>
<xs:enumeration value="greaterThan"/>
<xs:enumeration value="greaterThanEqual"/>
<xs:enumeration value="lessThan"/>
<xs:enumeration value="lessThanEqual"/>
<xs:enumeration value="isNull"/>
<xs:enumeration value="isNotNull"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:decimal" use="optional"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
我看到它具有与父组具有相同类型的子组。为什么这会导致循环引用?如何编辑此 XSD 才不会导致错误?
I am trying to build a C# class from a XSD file. In short I'm getting a circular reference error when trying to execute the XSD.exe tool:
Group 'setFilterCondition' from
targetNamespace='http://developer.cognos.com /schemas/report/7.0/' has
invalid definition: Circular group reference.
I pulled the definition of the group and I have the following XSD for it:
<xs:group name="setFilterCondition">
<xs:annotation>
<xs:documentation>Represents a simple or compound set filter condition</xs:documentation>
</xs:annotation>
<xs:choice>
<xs:element name="setFilterAnd">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:group ref="setFilterCondition" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="setFilterOr">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:group ref="setFilterCondition" minOccurs="2" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="setFilterNot">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
<xs:complexType>
<xs:group ref="setFilterCondition"/>
</xs:complexType>
</xs:element>
<xs:element name="memberCaptionCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a condition against the member caption.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="contains">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_contains"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWith">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_beginsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWith">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_endsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matches">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_matches"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="containsNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_containsNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_beginsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_endsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matchesNot">
<xs:annotation>
<xs:documentation source="doc_enum_memberCaptionCondition_operator_matchesNot"/>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="stringPropertyCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a condition against a string member property. The value attribute must be provided for all operators except isNull and isNotNull.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element ref="dmMemberProperty"/>
</xs:all>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="contains">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_contains"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWith">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_beginsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWith">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_endsWith"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matches">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_matches"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="containsNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_containsNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="beginsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_beginsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="endsWithNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_endsWithNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="matchesNot">
<xs:annotation>
<xs:documentation source="doc_enum_stringPropertyCondition_operator_matchesNot"/>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="isNull"/>
<xs:enumeration value="isNotNull"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="numericPropertyCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a numeric condition. The condition can be for either a tuple or a member property. The value attribute must be provided for all operators except isNull and isNotNull.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element ref="dmMemberProperty"/>
</xs:all>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="equal"/>
<xs:enumeration value="notEqual"/>
<xs:enumeration value="greaterThan"/>
<xs:enumeration value="greaterThanEqual"/>
<xs:enumeration value="lessThan"/>
<xs:enumeration value="lessThanEqual"/>
<xs:enumeration value="isNull"/>
<xs:enumeration value="isNotNull"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:decimal" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="tupleCondition">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
<xs:documentation>Defines a numeric condition. The condition can be for either a tuple or a member property. The value attribute must be provided for all operators except isNull and isNotNull.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:all>
<xs:element ref="dmTuple"/>
</xs:all>
<xs:attribute name="operator" use="required">
<xs:annotation>
<xs:documentation source="doc_att_filterCondition_operator"/>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="equal"/>
<xs:enumeration value="notEqual"/>
<xs:enumeration value="greaterThan"/>
<xs:enumeration value="greaterThanEqual"/>
<xs:enumeration value="lessThan"/>
<xs:enumeration value="lessThanEqual"/>
<xs:enumeration value="isNull"/>
<xs:enumeration value="isNotNull"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="value" type="xs:decimal" use="optional"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:group>
I see that it has sub groups that are of the same type of the parent. Why does this cause a circular reference? How can I edit this XSD to not cause the error?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不久前也有人问过同样的问题... 这是帖子 ,并附有一些答案。
我提出的解决方案应该更简单,特别是在您可以编辑 XSD 的情况下,而且事实是该组本身完全描述了所使用元素的内容。
诀窍是重用和实现内容的递归性,而不是通过组引用,而是通过复杂类型。如果您将您的架构与下面的架构进行比较,您会注意到我如何定义和使用复杂类型。
希望它能对其他人有所帮助......
重构的 XSD 与 XSD.exe 一起使用,该类生成干净,没有任何错误。
The same was asked on SO a while ago... this is the post, with some answers.
The solution I am proposing should be simpler, especially in your case where you can edit the XSD and the fact is the group itself fully describes the content of the element where is used.
The trick is then to reuse and implement the recusivity of your content not through group reference, but through complex type. If you compare your schema to the mine below, you'll notice how I've defined and used the complex type.
Hopefully it'll help someone else....
The refactored XSD works with XSD.exe, the class generates clean, without any error.