XML DTD配置:如何允许非强制#PCDATA及拒绝#PCDATA?
DTD配置方案:允许/拒绝#PCDATA
一、允许root包含非强制#PCDATA
要让root元素既可以包含文本内容(比如你示例里的allow),又能容纳可选的back、front元素,需要将root声明为混合内容元素。DTD中混合内容的规则是:#PCDATA必须放在分组的第一位,用|分隔允许的元素,最后用*表示非强制(0或多次出现),支持文本与元素交错排列。
修改后的DTD如下:
<!ELEMENT root (#PCDATA|back|front)*> <!ELEMENT back (#PCDATA)> <!ELEMENT front (#PCDATA)>
注:你原来的
back和front声明里用了(js*)和(para*),但你的示例XML里这两个元素的内容是纯文本(no#PCDATA、allow#PCDATA),所以这里调整为直接允许#PCDATA;如果实际需要容纳js或para元素,可保留原声明。
这个配置可以完美匹配你提供的XML结构:文本allow、back元素、文本allow、front元素的组合会被验证通过。
二、拒绝root包含#PCDATA
如果要禁止root出现任何文本内容,仅允许包含可选的back、front元素,你当前的DTD已经满足需求:
<!ELEMENT root (back?,front?)> <!ELEMENT back (js*)> <!ELEMENT front (para*)>
此时如果root中出现文本(比如你示例里的allow),XML验证会直接报错,因为该声明仅允许指定的子元素,不接受任何文本节点。
内容的提问来源于stack exchange,提问作者Jonah Currie
相关产品推荐
相关产品推荐

