2013-06-20 19 views
5

Ben bir XML belgesi için bir DTD oluşturmak çalışıyorum. Belgede iki çocuk var - biri yapılandırılmış veri ve diğer yapılandırılmamış verileri içerir;Bir DTD kullanarak, herhangi bir XML içeriğine izin veren bir öğe bildirilebilir mi?

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

Ben <unstructured> eleman herhangi bir geçerli XML içermeli sağlayan yukarıdaki XML için bir DTD oluşturmak istiyorum. Bu DTD'yi denedim;

Ancak hatalar şöyle oluşur;

..etc

No declaration for element hello 
No declaration for element world 

Ben <unstructured> herhangi bir geçerli XML içermeli izin istiyorum. Belirtilen bir öğenin ayrıştırılabilir XML içermesine izin vermek için DTD'de bir yol var mı?

PHP 5.3 DOMDocument :: validate kullanıyorum.

cevap

5

Hayır, yok.

ANY anahtar sözcüğünü kullanarak, bir DTD'nin gelebileceği kadar yaklaştın. Ama #PCDATA bir karışımını ve DTD'de bildirilmiş her eleman ANY eşleşir. Bildirilmemiş öğeleri kabul etmemektedir; DTD'lerin kısmi geçerlilik kavramı fazla değildir. Bu, XSD'de joker karakterlerin girilmesi için, eşleşen elemanların sıkı, gevşek veya atlanması için istekler için seçeneklerle motive edici kullanım durumlarından biri olmuştur.

1

Sadece iyi biçimlenmiş geçerli değil, basit bir cevap. DTD'leri kullanarak bir belgeyi doğrulamak isterseniz (xml şemasının aksine) her öğeyi bildirmeniz gerekir. Çalışma örneği şu şekilde görünecektir:

<?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> 
İlgili konular