如何为递归和未知命名的元素定义XML模式?

时间:2016-02-25 23:34:12

标签: xml xsd xsd-validation xml-validation

是否可以为递归的,未知命名的元素定义XML Schema? 例如:

<Bob age="72">
    <FavoriteColor>"Blue"</FavoriteColor>
    <Children>
        <Sally age="36">
            <FavoriteColor>"Green"</FavoriteColor>
            <Children />
        </Sally>
        <Joe age="34">
            <FavoriteColor>"Red"</FavoriteColor>
            <Children>
                <Tina age="5">
                    <FavoriteColor>"Blue"</FavoriteColor>
                    <Children />
                </Tina>
                <Frank age="6">
                    <FavoriteColor>"Yellow"</FavoriteColor>
                    <Children />
                </Frank>
            </Children>
        </Joe>
    </Children>
</Bob>

我对XSD很新,但我认为这需要一些递归和<xs:any>的组合。

请参阅: Recursion in an XML schema?how can I define an xsd file that allows unknown (wildcard) elements?

但是我找不到一个不涉及用更严格的形式重写隐含的Person元素的解决方案:

<Person name="Bob" age="72">
    <FavoriteColor />
    <Children />

原始的XML Schema能够吗?

1 个答案:

答案 0 :(得分:2)

您已正确识别xsd:any作为允许Children下任何元素的解决方案,并且您已正确识别用于表示类似家族树结构的递归类型模式。

但是,xsd:any不能完成它所管理的元素的部分约束任务。使用xsd:any后,您将无法控制该点下方的标记。它唯一的选择涉及有效性如何受到遇到元素定义的影响;见processContents strict vs lax vs skip for xsd:any

试图让第一个例子工作将是一场艰苦的战斗。 (你可以在XSD 1.1中使用断言,但是你会不自然地强迫断言去完成通过简单内容模型完成的工作。)使用第二种形式;它是更好的XML设计。