2013-06-20 9 views
5

私はXML文書用のDTDを作成しようとしています。ドキュメントには2つの子供がいます.1つは構造化されたデータと他の非構造化データです。DTDを使用すると、XMLコンテンツを許可する要素を宣言できますか?

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

私は<unstructured>要素は任意の有効なXMLを含めることができます上記の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 

..etc

私は<unstructured>は、任意の有効なXMLが含まれてできるようにしたいです。指定された要素に解析可能なXMLを含めることを許可する方法がDTDにありますか?

私はPHP 5.3 DOMDocument :: validateを使用しています。

答えて

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> 
関連する問題