gpt4 book ai didi

xml - DTD 所需元素排序

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:29 26 4
gpt4 key购买 nike

我想在 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)>

但在这种情况下,虽然验证会成功,但其中一个 child 可能会丢失。

当所需元素列表可以任何顺序出现时,我需要正确的 dtd 元素声明。

最佳答案

ChrisF 说你不能这样做是错误的(但感谢检查规范!); DevNull [现在称为 Daniel Haley] 说得对。

然而,有一个问题:DevNull 为parent 提供的内容模型违反了 XML 的确定性规则。非正式地,这些规则规定解析器必须知道,无需前瞻,文档中的每个元素匹配内容模型中的哪个标记。如果在 parent 元素中解析器看到一个 child1,如果不先行它就无法知道它是否刚刚匹配 child1 在 DevNull 的内容模型中。这是一个错误(但碰巧这是一个处理器没有义务报告的错误——这个错误意味着“所有赌注都关闭了,处理器可能会在这里做任何事情,包括没有注意到任何错误”)。

parent 的内容模型遵循确定性规则,可以通过分解公共(public)前缀来形成,因此:

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

这不如用其他模式语言声明此模型方便,而且对于三个以上的元素,手工操作容易出错且极其繁琐。但是用 DTD 声明您想要的内容模型并非不可能。或者我应该说,只有无法忍受任何不便的 DTD 作者才不可能。

另请注意,除非 child 的序列携带一些信息,否则一些设计权威强烈主张最好固定一个序列。

关于xml - DTD 所需元素排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3022845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com