使用DTD,是否可以声明允许任何XML内容的元素?

时间:2013-06-20 23:58:53

标签: xml validation dtd

我正在尝试为XML文档创建DTD。该文档有两个子项 - 一个包含结构化数据,另一个包含非结构化数据,例如;

<doc>
  <structured>
    <foo x="9"/>
    <foo x="4"/>
  </structured>
  <unstructured>
    <hello/>
    <world x="2">
      <hi msg="something"/>
      <anything/>
    </world>
  </unstructured>
</doc>

我想为上面的XML创建一个DTD,允许<unstructured>元素包含任何有效的XML。我试过这个DTD;

<!ELEMENT doc (structured,unstructured)
<!ELEMENT structured (foo*)
<!ELEMENT foo EMPTY>
<!ATTLIST foo x CDATA #REQUIRED>
<!ELEMENT unstructured ANY>

但是会产生这样的错误;

No declaration for element hello
No declaration for element world

...等

我想允许<unstructured>包含任何有效的XML。 DTD中是否有一种方法允许指定的元素包含任何可解析的XML?

我正在使用PHP 5.3 DOMDocument :: validate。

2 个答案:

答案 0 :(得分:5)

不,没有。

使用ANY关键字,您可以接近DTD。但是ANY匹配#PCDATA和DTD中声明的每个元素的混合。它不接受未申报的要素; DTD没有太多部分有效性的概念。

这是在XSD中引入通配符的激励用例之一,可以选择严格,宽松或跳过匹配元素的处理。

答案 1 :(得分:1)

刚刚形成的无效是简单的答案。如果要使用DTD验证文档,则必须声明每个元素(与xml架构不同)。工作示例如下所示:

<?xml version="1.0"?>
<!DOCTYPE doc [
<!ELEMENT doc (structured,unstructured)>
<!ELEMENT structured (foo*)>
<!ELEMENT hello EMPTY>
<!ELEMENT world (hi, anything)>
<!ATTLIST world x CDATA #REQUIRED>
<!ELEMENT hi EMPTY>
<!ATTLIST hi msg CDATA #REQUIRED>
<!ELEMENT anything EMPTY>
<!ELEMENT foo EMPTY>
<!ATTLIST foo x CDATA #REQUIRED>
<!ELEMENT unstructured ANY>
]>
<doc>
  <structured>
    <foo x="9"/>
    <foo x="4"/>
  </structured>
  <unstructured>
    <hello/>
    <world x="2">
      <hi msg="something"/>
      <anything/>
    </world>
  </unstructured>
</doc>