使用DTD-XML验证CDATA元素时出错

Don*_*ply 4 xml validation dtd cdata

我正在尝试使用我正在编写的DTD验证某些xml,但我总是在使用CDATA数据类型的元素上获得验证错误.像这样

<!ELEMENT title (#CDATA)> 
Run Code Online (Sandbox Code Playgroud)

我已经尝试使用textmate xml验证(XMLlint)和在线验证器(w3Schools)验证,我总是得到这个错误:

error: ContentDecl : Name or '(' expected
Run Code Online (Sandbox Code Playgroud)

谁能解释一下这里发生了什么?

干杯

完整的xml和dtd的例子(我从这里拿了这个,所以我希望它有效):

<?xml version="1.0"?>   
<!DOCTYPE bookstore [   
  <!ELEMENT bookstore (name,topic+)>   
  <!ELEMENT topic (name,book*)>   
  <!ELEMENT name (#PCDATA)>   
  <!ELEMENT book (title,author)>   
  <!ELEMENT title (#CDATA)>   
  <!ELEMENT author (#CDATA)>   
  <!ELEMENT isbn (#PCDATA)>   
  <!ATTLIST book isbn CDATA "0">   
  ]>   
<bookstore>   
  <name>Mike's Store</name>   
  <topic>   
    <name>XML</name>   
    <book isbn="123-456-789">   
      <title>Mike's Guide To DTD's and XML Schemas<</title>   
      <author>Mike Jervis</author>   
    </book>   
  </topic>   
</bookstore>  
Run Code Online (Sandbox Code Playgroud)

for*_*two 5

好吧,这个例子很糟糕,没有(#CDATA)元素内容模型这样的东西.

  <!DOCTYPE bookstore [   
  <!ELEMENT bookstore (name,topic+)>   
  <!ELEMENT topic (name,book*)>   
  <!ELEMENT name (#PCDATA)>   
  <!ELEMENT book (title,author)>   
  <!ELEMENT title (#PCDATA)>   
  <!ELEMENT author (#PCDATA)>   
  <!ELEMENT isbn (#PCDATA)>   
  <!ATTLIST book isbn CDATA "0">   
  ]>   
<bookstore>   
  <name>Mike's Store</name>   
  <topic>   
    <name>XML</name>   
    <book isbn="123-456-789">   
      <title>Mike's Guide To DTD's and XML Schemas</title>   
      <author>Mike Jervis</author>   
   </book>   
  </topic>   
</bookstore>
Run Code Online (Sandbox Code Playgroud)

更新:

W3C XML规范http://www.w3.org/TR/2008/REC-xml-20081126显然不允许#CDATA在内容模型中使用元素.从45号生产开始,然后继续生产 51.

  • +1为一个好的答案.@PigChicken - 那个XML肯定是无效的.没有"#CDATA"这样的东西.唯一一次你会看到类似的东西是在属性类型的`ATTLIST`声明中.它写成`CDATA`,而不是`#CDATA`.此外,XML甚至没有很好地形成; 在`</ title>`标签内有一个额外的`<`.四十二个人也抓到了那个,但在他/她的回答中没有提到它.如果我是你,我不确定是否会使用来自该网站的任何内容. (3认同)
  • @DevNull确切地说,在谷歌搜索结果中排名第一并不一定意味着你是对的! (2认同)