Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml 元素顺序不重要时的DTD_Xml_Dtd - Fatal编程技术网

Xml 元素顺序不重要时的DTD

Xml 元素顺序不重要时的DTD,xml,dtd,Xml,Dtd,我不知道如何为XML文件编写DTD,因为XML文件可以混合顺序包含相同的元素 下面是显示问题的小示例: <root> <element> <one></one> <two></two> </element> <element> <two></two> <one></one> </element&g

我不知道如何为XML文件编写DTD,因为XML文件可以混合顺序包含相同的元素

下面是显示问题的小示例:

<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*) )? >