DTD XML解析

时间:2016-01-18 15:42:11

标签: xml-parsing dtd xml-dtd dtd-parsing

如果我有:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE country[
<!ELEMENT country
(president | king | (king,queen) | queen)>
<!ELEMENT president (#PCDATA)>
<!ELEMENT king (#PCDATA)>
<!ELEMENT queen (#PCDATA)>
]>

如果我们尝试验证,为什么(president | king | (king,queen) | queen)>会生成以下错误 <country><king>Luis</king></country> 我们收到错误消息[...]Both 1st and 2nd occurence of "king" are possible。如果我写的是(president | (king) | (king,queen) | queen)>

,该怎么办?

1 个答案:

答案 0 :(得分:1)

这是因为您的内容模型是非确定性的。这意味着给定king元素,解析器无法在不向前看的情况下确定匹配哪个模型。有关详细信息,请参阅Deterministic Content Models (Non-Normative)

queen出现时,我要做的是king可选:

<!ELEMENT country (president | (king,queen?) | queen)>

对评论的回应......

  

XML处理器无法使用&#34;展望未来&#34;为了弄清楚会发生什么事情&#34;发生&#34;匹配&#34;国王&#34;,对吧?

右。例如,假设我们有country元素:

<country>
  <king/>
</country>

我们在DTD中声明country

<!ELEMENT country (president | king | (king,queen) | queen)>

country的内容有4种可能的选项:

  1. 一个&#34;总统&#34;
  2. 一个&#34;国王&#34;
  3. 一个&#34;国王&#34;其次是一个&#34;女王&#34;
  4. one&#34; queen&#34;
  5. 因此,如果我们的XML中有king元素,则解析器不知道它是选项#2还是选项#3。

    如果我们这样声明country

    <!ELEMENT country (president | (king,queen?) | queen)>
    

    country的内容有3种可能的选项:

    1. 一个&#34;总统&#34;
    2. 一个&#34;国王&#34;然后是零或一个&#34; queen&#34;
    3. one&#34; queen&#34;
    4. 如您所见,如果我们的XML中有一个king元素,那么解析器只能选择一个可能的选项。