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种可能的选择:
- 一个"president"
- 一个"king"
- 一个"king"接着一个"queen"
- 一个"queen"
所以如果我们的 XML 中有一个 king
元素,解析器不知道它是选项 #2 还是选项 #3。
如果我们这样声明country
:
<!ELEMENT country (president | (king,queen?) | queen)>
country
的内容有3种可能的选择:
- 一个"president"
- 一个 "king" 后跟零或一个 "queen"
- 一个"queen"
如您所见,如果我们的 XML 中有一个 king
元素,则解析器只能选择一个可能的选项。
如果我有:
<?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种可能的选择:
- 一个"president"
- 一个"king"
- 一个"king"接着一个"queen"
- 一个"queen"
所以如果我们的 XML 中有一个 king
元素,解析器不知道它是选项 #2 还是选项 #3。
如果我们这样声明country
:
<!ELEMENT country (president | (king,queen?) | queen)>
country
的内容有3种可能的选择:
- 一个"president"
- 一个 "king" 后跟零或一个 "queen"
- 一个"queen"
如您所见,如果我们的 XML 中有一个 king
元素,则解析器只能选择一个可能的选项。