我正在尝试为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。
答案 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>