我正在尝试从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以避免错误?
答案 0 :(得分:3)
前一段时间也问过同样的问题...... this is the post,有一些答案。
我建议的解决方案应该更简单,特别是在您可以编辑XSD的情况下,事实是组本身完全描述了使用元素的内容。
然后,诀窍是重用并实现内容的重复性,而不是通过组引用,而是通过复杂类型。如果您将模式与下面的矿山进行比较,您会注意到我如何定义和使用复杂类型。
希望它能帮助别人......
重构的XSD与XSD.exe一起使用,该类生成干净,没有任何错误。
<?xml version="1.0" encoding="utf-8"?>
<!--W3C Schema generated by QTAssistant/W3C Schema Refactoring Module (http://www.paschidev.com)-->
<xs:schema xmlns="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" targetNamespace="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:documentation>Generated from "Set2" under "Release1"</xs:documentation>
</xs:annotation>
<xs:element name="dmTuple" type="xs:string"/>
<xs:element name="dmMemberProperty" type="xs:string"/>
<xs:complexType name="setFilterConditionList">
<xs:sequence minOccurs="2" maxOccurs="unbounded">
<xs:group ref="setFilterCondition"/>
</xs:sequence>
</xs:complexType>
<xs:group name="setFilterCondition">
<xs:choice>
<xs:element ref="setFilterAnd">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
</xs:element>
<xs:element ref="setFilterOr">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
</xs:element>
<xs:element ref="setFilterNot">
<xs:annotation>
<xs:documentation source="rn_added_7.0"/>
</xs:annotation>
</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>
<xs:element name="setFilterAnd" type="setFilterConditionList"/>
<xs:element name="setFilterOr" type="setFilterConditionList"/>
<xs:element name="setFilterNot">
<xs:complexType>
<xs:group ref="setFilterCondition"/>
</xs:complexType>
</xs:element>
</xs:schema>