【问题标题】:Error validating CDATA elements with DTD - XML使用 DTD 验证 CDATA 元素时出错 - XML
【发布时间】:2011-11-23 14:53:02
【问题描述】:

我正在尝试使用我正在编写的 DTD 验证一些 xml,但我总是在具有 CDATA 数据类型的元素上收到验证错误。像这样

<!ELEMENT title (#CDATA)> 

我尝试使用 textmate xml 验证 (XMLlint) 和在线验证器 (w3Schools) 进行验证,但总是收到此错误:

error: ContentDecl : Name or '(' expected

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

干杯

完整的 xml 和 dtd 示例(我从 here 获取了这个,所以我希望它是有效的):

<?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>  

【问题讨论】:

  • 刚刚在 XMLlint 文档中找到了这个:--nocdata 用等效的文本节点替换 CDATA 部分。

标签: xml validation dtd cdata


【解决方案1】:

嗯,这个例子很糟糕,元素内容模型没有 (#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>

更新:

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

【讨论】:

  • 哦,这很奇怪。谷歌的最高结果说有xmlfiles.com/dtd/dtd_elements.asp
  • 我不知道他们是怎么得出这个结论的。查看更新。
  • +1 以获得好的答案。 @PigChicken - XML 绝对无效。没有#CDATA 这样的东西。唯一一次您会在属性类型的 ATTLIST 声明中看到类似内容。它写成CDATA,而不是#CDATA。此外,XML 格式也不是很好。在&lt;/title&gt; 标签内有一个额外的&lt;。四十二人也抓住了那个人,但在他/她的回答中没有提到。如果我是你,我不确定我是否会使用来自该网站的任何东西。
  • @DevNull 没错,在谷歌搜索结果中排名第一并不一定意味着你是对的!
  • 在 SGML 元素中的内容可以声明为 CDATA(例如 HTML 中的 &lt;script&gt; 元素)。在 XML 中这是不允许的。但在这种情况下,声明中不应有 # 字符。除了那个哈希字符之外,&lt;!ELEMENT title (#CDATA)&gt; 是因为括号而导致的语法错误。这实际上意味着&lt;title&gt; 有一个名为&lt;#CDATA&gt; 的子元素,而# 不是允许的名称字符。
猜你喜欢
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 2012-02-26
  • 2011-11-17
相关资源
最近更新 更多