我想以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作者无法忍受任何不便.
还要注意,除非孩子的顺序携带某些信息,否则一些设计部门强烈地强调,修复序列更好.