XML、DTD:如何使订单不重要

XML、DTD:如何使订单不重要,xml,dtd,Xml,Dtd,我开始使用XML文件和解析器作为存储数据的方便方式 我想使用DTD检查xml文件到达时的结构 这是我的DTD文件 < ?xml version="1.0" encoding="UTF-8"?> < !ELEMENT document (level*)> < !ELEMENT level (file,filelName?,fileNumber?)> < !ELEMENT file (#PCDATA)> < !ELEMENT filelName

我开始使用XML文件和解析器作为存储数据的方便方式

我想使用DTD检查xml文件到达时的结构

这是我的DTD文件

< ?xml version="1.0" encoding="UTF-8"?>
< !ELEMENT document (level*)>
< !ELEMENT level (file,filelName?,fileNumber?)>
< !ELEMENT file (#PCDATA)>
< !ELEMENT filelName (#PCDATA)>
< !ELEMENT fileNumber (#PCDATA)>

< !元素文档(级别*)>
< !元素级别(文件、文件名、文件号?)>
< !元素文件(#PCDATA)>
< !元素文件名(#PCDATA)>
< !元素文件号(#PCDATA)>
(请注意,文件名和文件号实际上完全是可选的)


第1组文件01
第1组文件02
文件2
0
...
因此,所有这些都很好。(我现在使用eclipse的“验证”选项来测试它)

然而,在测试时,我得到了我认为是一个严重的错误

如果我这样做

 <level>
  <levelName>Level 2</levelName>
  <levelNumber>0</levelNumber>
        <file>group1level02</file>
 </level>

二级
0
组1级别02
更改行的顺序,Eclipse拒绝验证它

我想知道这是否是Eclipse的问题,或者顺序是否真的很重要

如果顺序很重要,我如何更改DTD使其工作,而不管元素的顺序如何


我无法真正更改XML,因为我已经编写了所有XML文件和解析器(我知道我在lol中做得不对)。

对于DTD,子节点必须按照元素定义中列出的顺序显示。除非您想升级到XSD模式,否则没有办法允许其他排序


附录:Per@Gaim,您可以使用(a,b,c…)|(b,a,c…)语法提供替代顺序,但这对于超过3个嵌套元素来说并不实际,因为任意顺序允许阶乘数量的顺序——3个元素6个,4个元素24个,5个元素120个——以及巧妙地使用?运算符肯定会导致对奇怪情况的错误验证。

正如Roger所说,只有有序列表,但您可以使用运算符或
|
定义所有可接受的组合

<!ELEMENT level ((file,filelName?,fileNumber?)|(filelName?,fileNumber?,file))>


看,选项部分中有一个例子,在DTD中声明带有出现约束的无序列表通常会导致冗长或复杂的声明。这样做的一个重要原因是DTD必须是确定性的,因此即使切换到XML模式也不一定有帮助

以下是元素
的DTD声明,其中包含:

  • 正好是1个
    元素
  • 0-1
    元素
  • 0-1
    元素
  • 以任何可能的顺序
代码:


如果您不太在意有效性,您可以使用
任何
关键字:

<!ELEMENT level ANY>

我遇到过类似的问题,这两种情况可能会出现:

<Instructors>
  <Lecturer>
  </Lecturer>
  <Professor>
  </Professor>
</Instructors>

<Instructors>
  <Lecturer>
  </Lecturer>
  <Professor>
  </Professor>
</Instructors>

我找到的唯一解决方案是:

<!ELEMENT Instructors ANY>


也许有更好的解决方案,但它对我的特殊问题很有效。

如果你能猜出元素的子元素数的合理上限,那么就有一种极其肮脏的方法来解决这个问题。以下是0-3个孩子的示例:

<!ELEMENT myUnorderedElement ( (option1 | option2 | option3)?, (option1 | option2 | option3)?, (option1 | option2 | option3)? >


因此,您允许元素“MyUnorderElement”有0-3个option1、option2或option3类型的子元素。

这是一个非常小的系统,因此我认为更改为XSD不太有趣,但我将研究它,但这并不是严格意义上的。您可以允许其他订单,只需显式列出所有您希望允许的订单即可。XML模式中允许的排序规则与DTD中允许的排序规则没有太大区别,在模式中表达它们就简单多了。。。我本以为它会更灵活。。。我将不得不使用| |,因为我必须按照xml的读取顺序进行假设。谢谢您的解决方案,这不是一个有效的DTD,因为它不是确定性的。即使它是有效的,它也不允许子元素按任何可能的顺序排列。一年前,我找不到更好的主意。你似乎在做詹妮弗·维多姆(Jennifer Widom)的斯坦福大学数据库MOOC的XML练习……我来到这里是因为同样的问题:-)通过xmllint,我再也没有错误了。谢谢@Suzana_K&Alexander_Gryanko。我在括号内的属性后面包含运算符。。。
<!ELEMENT Instructors ANY>
<!ELEMENT myUnorderedElement ( (option1 | option2 | option3)?, (option1 | option2 | option3)?, (option1 | option2 | option3)? >