在递归节点的情况下生成 XSD

Generate XSD in case of Recursive Node

当我们在XML中有递归节点时,我们如何生成XSD?我的案例 "Questions" Node 将包含在 "Question" Node.

下面是我正在处理的示例 XML

<Sections>
<Section>
    <SectionId>12</SectionId>
     <SectionName>test test</SectionName>
    <Questions>
        <Question>
            <Id>100</Id>
            <QuestionText>Sample Text</QuestionText>
            <Questions>
                <Question>
                    <Id>101</Id>
                    <QuestionText>Sample Text</QuestionText>
                    <Questions>
                        <Question>
                            <Id>102</Id>
                            <QuestionText>Sample Text</QuestionText>                
                        </Question>
                        <Question>
                            <Id>103</Id>
                            <QuestionText>Sample Text</QuestionText>
                        </Question>
                    </Questions>                
                </Question>
                <Question>
                    <Id>104</Id>
                    <QuestionText>Sample Text</QuestionText>
                </Question>
            </Questions>
        </Question>
        <Question>
        <Id>200</Id>
        <QuestionText>Sample Text</QuestionText>
        <Questions>
            <Question>
                <Id>201</Id>
                <QuestionText>Sample Text</QuestionText>                
            </Question>
            <Question>
                <Id>202</Id>
                <QuestionText>Sample Text</QuestionText>
            </Question>
        </Questions>
    </Question>
    </Questions>
</Section></Sections>

诀窍是按名称创建一个元素,并在其中按名称引用另一个元素,该元素将此元素作为其子元素。也许一个例子可以说明这一点:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <xs:element name="Questions">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element ref="Question"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Question">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Id" />
                <xs:element name="QuestionText" />
                <xs:element ref="Questions" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

当应用于您的示例 XML 时,它验证成功。

更新

完全违背 SO 的精神,但作为对提问者的一种姿态,这里更新了适用于更新后的问题文本的上述架构:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

    <xs:element name="Sections">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element ref="Section"></xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Section">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="SectionId"/>                
                <xs:element name="SectionName"/>                
                <xs:element ref="Questions"/>  
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Questions">
        <xs:complexType>
            <xs:sequence maxOccurs="unbounded">
                <xs:element ref="Question"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Question">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Id" />
                <xs:element name="QuestionText" />
                <xs:element ref="Questions" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>