【问题标题】:How to define an XML Schema for recursive and unknown-named elements?如何为递归和未知命名元素定义 XML 模式?
【发布时间】:2016-06-09 00:14:19
【问题描述】:

是否可以为递归的未知名称元素定义 XML 模式? 例如:

<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 还很陌生,但我认为这需要递归和 &lt;xs:any&gt; 的某种组合。

见: 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 可以吗?

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

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

    但是,xsd:any 无法完成对其管辖的元素进行部分约束的任务。一旦你使用xsd:any,你就失去了对低于该点的标记的控制。它唯一的选项是关于有效性如何受到遇到元素的定义的影响;见processContents strict vs lax vs skip for xsd:any

    试图使第一个示例工作将是一场艰苦的战斗。 (您可以在 XSD 1.1 中使用断言,但您将不自然地强制断言执行通过简单内容模型完成的任务。)使用第二种形式;这是更好的 XML 设计。

    【讨论】:

    • 通用形式还具有允许&lt;Person name="Mary Ann"/&gt; 的优点,您并不想限制人们根据 NCNames 的规则来命名他们的孩子。
    • 没有提到这个优势,因为我认为只要解析器编写者的工作更轻松,Mary-Ann、Mary_Ann 或 MaryAnn 的父母就不会介意。 :-)
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    相关资源
    最近更新 更多