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

时间:2015-09-15 16:07:20

标签: xml xsd xml-parsing xsd-validation

当我们在XML中使用递归节点时,我们如何生成XSD?我的案例"问题"节点将包含在"问题"节点

以下是我正在处理的示例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>

1 个答案:

答案 0 :(得分:1)

诀窍是按名称创建元素并在其中,引用具有此元素作为其子元素的名称的另一个元素。也许举例说明这有助于:

<?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>