在递归节点的情况下生成 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>
当我们在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>