2013-06-20 10 views
5

Sto provando a creare un DTD per un documento XML. Il documento ha due bambini: uno contiene dati strutturati e gli altri dati non strutturati, ad es.Utilizzando un DTD, è possibile dichiarare un elemento che consente qualsiasi contenuto XML?

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

voglio creare un DTD per il XML sopra che permette l'elemento <unstructured> per contenere qualsiasi XML valido. Ho provato questo DTD;

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

Ma gli errori vengono generati in questo modo;

No declaration for element hello 
No declaration for element world 

.etc

voglio permettere <unstructured> contenere alcun XML valido. C'è un modo in un DTD per consentire a un elemento specificato di contenere qualsiasi XML analizzabile?

Sto usando PHP 5.3 DOMDocument :: validate.

risposta

5

No, non c'è.

Sei arrivato vicino come può arrivare un DTD, utilizzando la parola chiave ANY. Ma ANY corrisponde a una combinazione di #PCDATA e ogni elemento dichiarato nella DTD. Non accetta elementi non dichiarati; Le DTD non hanno molta nozione di validità parziale.

Questo era uno dei casi di utilizzo motivanti per l'introduzione di caratteri jolly in XSD con opzioni per chiedere l'elaborazione rigorosa, lassista o salta degli elementi corrispondenti.

1

Appena ben formato non è valido è la risposta semplice. Se vuoi convalidare un documento usando DTD devi dichiarare ogni elemento (a differenza dello schema xml). L'esempio di lavoro sarebbe il seguente:

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