能否在DTD中声明含EMPTY与PCDATA的元素:<!ELEMENT name (EMPTY | (#PCDATA))>?
关于DTD中声明EMPTY/PCDATA混合元素的问题
嘿,这个问题问得很实在——直接用<!ELEMENT name (EMPTY | (#PCDATA))>这种写法在XML DTD里是不合法的哦,我来给你掰扯清楚原因和正确的实现方式:
为什么原写法不行?
DTD的语法规则里,EMPTY是个特殊的关键字,专门用来声明“元素必须完全没有内容(既不能有文本,也不能有子元素)”。它属于独立的元素内容类型,没法和(#PCDATA)这类字符数据类型用|(选择运算符)组合在一起,解析器看到这种写法会直接报错。正确的实现方式
如果你想要元素既可以是空的(比如<name/>或<name></name>),又可以包含普通文本内容(比如<name>Alice</name>),只需要这么写就够了:<!ELEMENT name (#PCDATA)>这个声明默认允许元素包含零或多个字符数据,自然就覆盖了“空元素”和“带文本元素”两种场景,完全满足你的需求。
要是你有更严格的要求(比如元素要么完全空,要么至少有一个字符,不允许空文本),那不好意思,DTD本身没法做这么精确的限制——因为
(#PCDATA)天生就允许空内容。不过绝大多数情况下,上面的写法已经能搞定你想要的效果了。
内容的提问来源于stack exchange,提问作者balimaco00
相关产品推荐
相关产品推荐

