加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – DTD要求的元素排序

发布时间:2020-12-16 07:52:41 所属栏目:百科 来源:网络整理
导读:我想以dtd中定义的任何顺序列出所需的元素,但不知道我该怎么做. 例如,我有以下定义: !ELEMENT parent (child1,child2,child3) 这个dtd声明将成功地验证下面的一个xml: parent child1/child1 child2/child2 child3/child3/parent 但是在以下情况下,xml将不
我想以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作者无法忍受任何不便.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读