我需要为 XML文件创建一个非常灵活的模式.它必须满足以下要求: 验证我们需要存在的一些元素,并了解其确切的结构 验证一些可选的元素,我们知道它的确切结构 允许任何其他元素 以
>验证我们需要存在的一些元素,并了解其确切的结构
>验证一些可选的元素,我们知道它的确切结构
>允许任何其他元素
>以任何顺序允许它们
快速举例:
XML
<person> <age></age> <lastname></lastname> <height></height> </person>
我在XSD上的尝试:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="person"> <xs:complexType> <xs:sequence> <xs:element name="firstname" minOccurs="0" type="xs:string"/> <xs:element name="lastname" type="xs:string"/> <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
现在我的XSD满足要求1和3.它不是有效的模式,但是,如果firstname和lastname都是可选的,那么它不满足要求2,并且订单是固定的,这不符合要求4.
现在我只需要验证我的XML.我对以任何方式执行此操作的建议持开放态度,无论是以.NET 3.5编程还是其他类型的架构等.
谁能想到满足所有4个要求的解决方案?
我今天经常考虑这个问题.我正在考虑这个xs有多么难:所有规则都使XML数据库能够存储具有非结构化“CMS”类似数据的文档,同时还验证数据.然后我发现XHTML允许以任何顺序标记页面,以非常灵活的方式排列嵌套元素.
所以这里是XHTML 1.1模式的摘录:
<xs:group name="InlForm.class"> <xs:choice> <xs:element ref="input"/> <xs:element ref="select"/> <xs:element ref="textarea"/> <xs:element ref="label"/> <xs:element ref="button"/> </xs:choice> </xs:group> <xs:group name="Inline.extra"> <xs:choice/> </xs:group> <xs:group name="Ruby.class"> <xs:sequence> <xs:element ref="ruby"/> </xs:sequence> </xs:group> <!-- Inline.class includes all inline elements, used as a component in mixes --> <xs:group name="Inline.class"> <xs:choice> <xs:group ref="InlStruct.class"/> <xs:group ref="InlPhras.class"/> <xs:group ref="InlPres.class"/> <xs:group ref="I18n.class"/> <xs:group ref="Anchor.class"/> <xs:group ref="InlSpecial.class"/> <xs:group ref="InlForm.class"/> <xs:group ref="Ruby.class"/> <xs:group ref="Inline.extra"/> </xs:choice> </xs:group> <xs:group name="Heading.class"> <xs:choice> <xs:element ref="h1"/> <xs:element ref="h2"/> <xs:element ref="h3"/> <xs:element ref="h4"/> <xs:element ref="h5"/> <xs:element ref="h6"/> </xs:choice> </xs:group>
它们基本上是递归地嵌套组的选择.我想这个写下这个的人是在一个安全的机构中度过余生,每天接受几次强制性药物治疗.
我希望这有帮助.我认为这说明了如何在XSD 1.0中“真正”完成super-flexi模式.
编辑 – 它的工作原理!您可以创建所有其他组的“主”组,并使用此示例ListItem元素定义以允许以任何顺序连续嵌套元素.确保ListItem也包含在一个组中,以便递归有效.
<xs:element name="ListItem"> <xs:complexType> <xs:sequence> <xs:group ref="content:any.mix" minOccurs="1" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element>
所以我的any.mix组看起来像这样:
<xs:group name="any.mix"> <xs:choice> <xs:group ref="content:item.class" /> <xs:group ref="content:media.class" /> <xs:group ref="content:data.class" /> <xs:group ref="content:list.class" /> </xs:choice> </xs:group>
并且每个“类”组都包含更多组的选择,依此类推,直到它们最终击中元素,如果您愿意,叶级实际标记.
小组本身不应该有循环引用; ‘技巧’是在any.mix组的无限发生中,即它是一个具有无限根选择的选择树.
卢克