2013-06-20 7 views
5

Ich versuche, eine DTD für ein XML-Dokument zu erstellen. Das Dokument hat zwei untergeordnete Elemente - eines enthält strukturierte Daten und die anderen unstrukturierten Daten z.Kann mit einer DTD ein Element deklariert werden, das beliebigen XML-Inhalt zulässt?

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

Ich möchte eine DTD für die oben genannten XML erstellen, die das <unstructured> Element jedes gültige XML enthalten können. Ich habe diese DTD ausprobiert;

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

Aber Fehler werden wie folgt generiert;

No declaration for element hello 
No declaration for element world 

..etc

Ich möchte <unstructured> ermöglichen jede gültige XML zu enthalten. Gibt es in einer DTD einen Weg, einem bestimmten Element die Möglichkeit zu geben, ein parsables XML zu enthalten?

Ich benutze PHP 5.3 DOMDocument :: validate.

Antwort

5

Nein, gibt es nicht.

Sie kamen so nah wie eine DTD, indem Sie das Schlüsselwort ANY verwenden. Aber ANY entspricht einer Mischung aus #PCDATA und jedem in der DTD deklarierten Element. Es akzeptiert keine nicht deklarierten Elemente; DTDs haben wenig Ahnung von Teilgültigkeit.

Dies war einer der motivierenden Anwendungsfälle für die Einführung von Wildcards in XSD mit Optionen für die strikte, lax oder überspringende Verarbeitung der übereinstimmenden Elemente.

1

Nur gut gebildet ist nicht gültig, das ist die einfache Antwort. Wenn Sie ein Dokument mithilfe von DTDs validieren möchten, müssen Sie jedes Element deklarieren (im Gegensatz zum XML-Schema). Das Arbeitsbeispiel würde so aussehen:

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