2

XSDファイルからC#クラスを構築しようとしています。つまり、XSD.exeツールを実行しようとすると、循環参照エラーが発生します。

targetNamespace ='http://developer.cognos.com/schemas/report/7.0/'のグループ'setFilterCondition'の定義が無効です:循環グループ参照。

グループの定義を引き出したところ、次の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を編集するにはどうすればよいですか?

4

1 に答える 1

4

同じことが少し前にSOで尋ねられました...これはいくつかの答えを持った投稿です。

私が提案している解決策は、特に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>
于 2012-01-28T00:22:32.667 に答える