DTD XML 解析

DTD XML 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)> ?

会怎样

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

我要做的是在 king 存在时使 queen 可选:

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

回复评论...

The XML processor cannot use "look ahead" in order to figure out what is gonna "happen" after matching "king", right?

没错。例如,假设我们有这个 country 元素:

<country>
  <king/>
</country>

我们在 DTD 中这样声明 country

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

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

  1. 一个"president"
  2. 一个"king"
  3. 一个"king"接着一个"queen"
  4. 一个"queen"

所以如果我们的 XML 中有一个 king 元素,解析器不知道它是选项 #2 还是选项 #3。

如果我们这样声明country

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

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

  1. 一个"president"
  2. 一个 "king" 后跟零或一个 "queen"
  3. 一个"queen"

如您所见,如果我们的 XML 中有一个 king 元素,则解析器只能选择一个可能的选项。