关于DTD中用#PCDATA表示复合内容的疑惑。

时间:2023-01-16 16:30:34
最近在学XML,刚刚看到DTD部份,碰到一个#PCDATA的无厘头问题,研究了好久也没什么头绪,麻烦各位高人帮我看看。

在DTD我们使用Element规定某个元素下可以包含的子元素,例如:
<!ELEMENT 联系人 (姓名,电话,EMAIL)*>
这样是正常的一种写法,效果也正常。
但在IBM和W3C的教程中,有提及一种使用#PCDATA表明某个元素下面可以包含的内容。
我试了IBM的例子<!ELEMENT 联系人(姓名|电话|EMAIL|#PCDATA)*>,这样XMLSPY 2006和IE7都会报错。
换成W3C的例子<!ELEMENT note (#PCDATA|to|from|header|message)*>就没问题了。
(根据《XML高级编程》所述,IBM的例子是错的,W3C的例子是唯一的写法)
对于此语句,我的理解是note元素下面,可以包含#PCDATA类型的内容,
同时根据需求也可以包含to、from、header和message这些子标签,但不是必须的,而且不必按顺序。
不知我这样理解是否有误?

那我想强制to、from、header和message这些子标签一定要填写?Element这个标签得怎么写?

5 个解决方案

#1


我也遇到了相同的问题,暂时还没有什么好的办法,只能是按上面写的<!ELEMENT   note   (#PCDATA ¦to ¦from ¦header ¦message)* >
要不就得改变结构,把#PCDATA作为元素单提出来...

因为  

元素内容说明-混合内容
说明元素既可以包含字符数据,也可以包含子元素。
混合内容必须被定义为零个或者多个。
在使用混合内容模型时,#PCDATA关键字必须是模型中的第一个选项, 不能在模型中使用逗号、问号和加号。用竖线分隔的#PCDATA和元素的列表是合法的,其它用法都是非法的。

<?xml vesion=”1.0” encoding=”gb2312”?>
<!DOCTYPE employee [
<!ELEMENT employee (#PCDATA | name)*>
<!ELEMENT name (#PCDATA )>
!>

#2


<?xml   vesion=”1.0”   encoding=”gb2312”?> 
<!DOCTYPE   employee   [ 
<!ELEMENT   employee    (#PCDATA   ¦   name)*> 
<!ELEMENT   name   (#PCDATA   )> 
]>
代表二选一

#3


可能是解析器的不同吧!

不过好像只能这样写(#PCDATA ¦to ¦from ¦header ¦message)*  才正确...
必须第一个而且像二楼说的一样。。。其它的形式全部过不到。。。搞不懂!

#4


当混合使用时,#pcdata 必须是枚举类型值的第一个;

#5


lz要干嘛?

#1


我也遇到了相同的问题,暂时还没有什么好的办法,只能是按上面写的<!ELEMENT   note   (#PCDATA ¦to ¦from ¦header ¦message)* >
要不就得改变结构,把#PCDATA作为元素单提出来...

因为  

元素内容说明-混合内容
说明元素既可以包含字符数据,也可以包含子元素。
混合内容必须被定义为零个或者多个。
在使用混合内容模型时,#PCDATA关键字必须是模型中的第一个选项, 不能在模型中使用逗号、问号和加号。用竖线分隔的#PCDATA和元素的列表是合法的,其它用法都是非法的。

<?xml vesion=”1.0” encoding=”gb2312”?>
<!DOCTYPE employee [
<!ELEMENT employee (#PCDATA | name)*>
<!ELEMENT name (#PCDATA )>
!>

#2


<?xml   vesion=”1.0”   encoding=”gb2312”?> 
<!DOCTYPE   employee   [ 
<!ELEMENT   employee    (#PCDATA   ¦   name)*> 
<!ELEMENT   name   (#PCDATA   )> 
]>
代表二选一

#3


可能是解析器的不同吧!

不过好像只能这样写(#PCDATA ¦to ¦from ¦header ¦message)*  才正确...
必须第一个而且像二楼说的一样。。。其它的形式全部过不到。。。搞不懂!

#4


当混合使用时,#pcdata 必须是枚举类型值的第一个;

#5


lz要干嘛?