2013-06-20 10 views
5

Próbuję utworzyć DTD dla dokumentu XML. Dokument ma dwoje dzieci - jeden zawiera dane strukturalne, a inne niestrukturalne dane np.;Korzystając z DTD, można zadeklarować element dopuszczający dowolną treść XML?

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

Chcę stworzyć DTD dla powyższej XML, który umożliwia element <unstructured> zawierać dowolny prawidłowy XML. Próbowałem tego DTD;

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

Ale błędy są generowane w ten sposób;

No declaration for element hello 
No declaration for element world 

..etc

chcę pozwolić <unstructured> zawierać dowolny prawidłowy XML. Czy jest jakiś sposób w DTD, aby dany element mógł zawierać dowolny parsable XML?

Używam PHP 5.3 DOMDocument :: validate.

Odpowiedz

5

Nie, nie ma.

Przyszedłeś tak blisko, jak DTD może nadejść, używając słowa kluczowego ANY. Ale ANY pasuje do mieszaniny #PCDATA i każdego elementu zadeklarowanego w DTD. Nie akceptuje elementów niezadeklarowanych; DTD nie mają pojęcia częściowej ważności.

Był to jeden z motywujących przykładów użycia do wprowadzania symboli wieloznacznych w XSD z opcjami żądania ścisłego, luźnego lub pominięcia przetwarzania pasujących elementów.

1

Po prostu dobrze uformowany jest nieprawidłowy, to jest prosta odpowiedź. Jeśli chcesz zweryfikować dokument przy użyciu DTD, musisz zadeklarować każdy element (w przeciwieństwie do schematu XML). Działający przykład będzie wyglądał następująco:

<?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> 
Powiązane problemy