XML DTD父对象与子对象相同

时间:2014-06-06 05:15:51

标签: xml dtd

举个例子。在我的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)>

2 个答案:

答案 0 :(得分:2)

根据您的DTD,<expression>元素必须包含序列

  1. 一个或多个<left-bracket>元素,后跟
  2. 正好一个 <right-bracket>元素,后跟
  3. 正好一个 <operation>元素,后跟
  4. 一个或多个<number>元素
  5. 这条代表<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)>