Xml 元素顺序不重要时的DTD
我不知道如何为XML文件编写DTD,因为XML文件可以混合顺序包含相同的元素 下面是显示问题的小示例:Xml 元素顺序不重要时的DTD,xml,dtd,Xml,Dtd,我不知道如何为XML文件编写DTD,因为XML文件可以混合顺序包含相同的元素 下面是显示问题的小示例: <root> <element> <one></one> <two></two> </element> <element> <two></two> <one></one> </element&g
<root>
<element>
<one></one>
<two></two>
</element>
<element>
<two></two>
<one></one>
</element>
<element>
<two></two>
<two></two>
<two></two>
<two></two>
<one></one>
<one></one>
</element>
</root>
(或
+
,如果必须至少有一个。)给定的DTD不是确定性的,xml解析器可能会在这方面出错。(参见XML规范的(规范性)和(非规范性)。原因是与SGML的兼容性,如果有人记得的话。)
在DTD中,空元素将匹配两个分支。Dave的解决方案改变了DTD的含义,因为它接受
<root>
<element>
<one />
<two />
<one />
</element>
</root>
如果您不想这样做,请确保在每个“或”-分支上,您只需查看前面的一个标记(例如,通过书写),就可以确切地知道要使用哪一个标记
<!ELEMENT element ((one+, two*) | (two+, one*))? >
您的解决方案不是确定性的,因为
<element>
<two/>
</element>
验证程序遇到第一个
,它不知道应该选择哪个分支。只有在读取了所有的
元素后,它才知道这一点。
要在保持模型确定性的同时保持顺序一致,请使用
<!ELEMENT element ( (one+, two*) | (two+, one*) )? >
这里的要点是:1)通过使用不同的强制元素开始每个分支来保持模型的确定性2)但最后仍然允许使用
?
空,这使得内容模型成为可选的。在XMLSpy中,DTD和XML文件是有效的。可能是xmllint中的一个bug?看来您并没有想象中那么生疏:)谢谢。这是不确定的,所以它再次导致了与这个问题相同的问题。@jasso:您当然是对的。我已经纠正了(我相信)。不,你不能用这种方式使用关键字EMPTY
。现在,您允许结构
,但不允许
愚弄我。对不起,线路有杂音。
<!ELEMENT element ((one+, two*) | (two+, one*))? >
<element>
<two/>
</element>
<element>
<two/>
</element>
<!ELEMENT element ( (one+, two*) | (two+, one*) )? >