XML、DTD:如何使订单不重要
我开始使用XML文件和解析器作为存储数据的方便方式 我想使用DTD检查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 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)? >