2013-06-20 44 views
5

我想爲XML文檔創建一個DTD。該文件有兩個孩子 - 一個包含結構化數據和其他非結構化數據,例如;使用DTD,是否可以聲明允許任何XML內容的元素?

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

我想創建上述XML允許<unstructured>元素包含任何有效的XML DTD的。我試過這個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。

回答

5

不,沒有。

通過使用ANY關鍵字,您可以像DTD一樣接近。但ANY匹配#PCDATA和DTD中聲明的每個元素的混合。它不接受未申報的要素; DTD沒有太多的部分有效性概念。

這是在XSD中引入通配符的激勵用例之一,它提供了要求嚴格,鬆散或跳過處理匹配元素的選項。

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> 
相關問題