举个例子。在我的xml里面
<?xml version="1.0"?>
<!DOCTYPE expression SYSTEM "task3-1.dtd">
<expression>
<left-bracket>(</left-bracket>
<expression>
<left-bracket>(</left-bracket>
<expression>
<number>24</number>
<operation>+</operation>
<number>24</number>
</expression>
<right-bracket>)</right-bracket>
<operation>*</operation>
<number>5</number>
</expression>
<right-bracket>)</right-bracket>
<operation>-</operation>
<number>6</number>
</expression>
当我尝试运行dtd时,总是错误: 元素“表达式”具有无效的子元素“数字”。预期可能元素列表:'left-bracket'
<!ELEMENT expression (left-bracket+,right-bracket,operation,number+)>
<!ELEMENT left-bracket (#PCDATA)>
<!ELEMENT right-bracket (#PCDATA)>
<!ELEMENT operation (#PCDATA)>
<!ELEMENT number (#PCDATA)>
答案 0 :(得分:2)
根据您的DTD,<expression>
元素必须包含序列:
<left-bracket>
元素,后跟<right-bracket>
元素,后跟<operation>
元素,后跟<number>
元素这条代表<expression>
内容模型的行声明:
(left-bracket+,right-bracket,operation,number+)
由于您的实例在<expression>
后面有一个<left-bracket>
元素(而不是<right-bracket>
或另一个<left-bracket>
),因此无法验证。
错误消息引用<number>
元素,该元素也不会出现在<expression>
内的该位置。根据DTD,可能存在多个<number>
元素(一个是强制性的),但仅限于所有其他元素。
如果要创建XML文件以遵守DTD规则,则必须更改文档结构。如果您实际上正在设计DTD以表示您希望在文档中验证的某些规则,那么您必须决定如何表示您的数据。例如,设计expression
元素的内容模型的方式不允许嵌套表达式。
此DTD验证您的实例并允许嵌套表达式(当然,它可能不是您想要的 - 我基于您的文档结构快速查看):
<!ELEMENT expression ( ( (left-bracket,expression+,right-bracket)*,(operation,number)* ) | (number,operation,number) )>
<!ELEMENT left-bracket (#PCDATA)>
<!ELEMENT right-bracket (#PCDATA)>
<!ELEMENT operation (#PCDATA)>
<!ELEMENT number (#PCDATA)>
答案 1 :(得分:1)
一种选择是将所有内容?
(零或一个)......
<!ELEMENT expression (left-bracket?,expression?,right-bracket?,number?,operation?,number?)>
<!ELEMENT left-bracket (#PCDATA)>
<!ELEMENT right-bracket (#PCDATA)>
<!ELEMENT operation (#PCDATA)>
<!ELEMENT number (#PCDATA)>