xml – DTD要求的元素排序

前端之家收集整理的这篇文章主要介绍了xml – DTD要求的元素排序前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想以dtd中定义的任何顺序列出所需的元素,但不知道我该怎么做.

例如,我有以下定义:

<!ELEMENT parent (child1,child2,child3)>

这个dtd声明将成功地验证下面的一个xml:

<parent>
   <child1></child1>
   <child2></child2>
   <child3></child3>
</parent>

但是在以下情况下,xml将不会通过验证:

<parent>
   <child2></child2>
   <child1></child1>
   <child3></child3>
</parent>

可能的解决方案之一是声明

<!ELEMENT parent (child1 | child2 | child3)>

但在这种情况下,一个孩子可能会丢失,尽管验证将会成功.

对于所需元素的列表可以以任何顺序存在的情况,我需要正确的dtd元素声明.

ChrisF是错误的说你不能做到这一点DevNull [现在被称为丹尼尔·哈利]是对的说可以.

然而,有一个复杂性:DevNull为父母提供的内容模型违反了XML的确定性规则.非正式地,这些规则说,解析器必须知道内容模型中每个元素匹配哪个标记,没有前瞻.如果在父元素中,解析器看到一个child1,那么在DevNull的内容模型中,它是否与child1的第一个或第二个出现匹配,就无法知道没有前瞻.这是一个错误(但是发生这是一个错误,处理器没有义务报告 – 这是一个错误,这意味着“所有投注都关闭,处理器可能在这里做任何事情,包括没有注意到任何事情是错误的”).

可以通过分解公共前缀来形成遵守决定论规则的父母的内容模型,从而:

<!ELEMENT parent ( 
                   (child1,( (child2,child3)
                            | (child3,child2)))
                 | (child2,( (child1,child1)))
                 | (child3,child2)
                            | (child2,child1)))
                 ) >

这比声明不太方便,这个模型可以在其他模式语言中,而对于三个以上的元素来说,它是容易出错的,非常繁琐的手工操作.但是,用DTD声明您想要的内容模型是不可能的.或者也许我应该说只有DTD作者无法忍受任何不便.

还要注意,除非孩子的顺序携带某些信息,否则一些设计部门强烈地强调,修复序列更好.

猜你在找的XML相关文章