Först en kort definition
PCDATA, eller som det skrivs i DTD:n #PCDATA, betyder Parsed Character DATA,
d.v.s tolkad textdata
CDATA betyder Character DATA, d.v.s otolkad textdata
Mer om DTD
ANY
Man kan släppa alla tyglar och säga att man godkänner vad skit
som helst med ordet ANY i DTD:n. Filen måste dock fortfarande vara well-formed,
och eventuella tags måste finnas deklarerade. Nedan visas ett exempel
på en XML fil som använder sig av en intern DTD som godkänner
ostrukturerad data:
xml9_1.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE data [
<!ELEMENT data ANY>
<!ELEMENT extra (#PCDATA)>
]>
<data>
Här får jag skriva lite vad jag vill.
Med <extra>taggar</extra> och vad jag vill...
Detta eftersom jag sagt att allt (ANY) duger.
</data>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
OBS. Jag använder ibland interna DTD för att förenkla
dokumentationen. Helst skall man dock ha en extern DTD eftersom detta gör
det lätta att validera flera filer.
MIXED MODE XML
Man kan även skapa s.k. Mixed Mode XML. Detta betyder att man tillåter
"fri text" men eventella taggar i texten måste begränsas.
I nedanstående innehåller <data> fri text men om vi skall
sätta in några xml tags så måste dessa vara antingen
<firstname> eller <lastname>. Den sista <data> noden kommer
att förorsaka valideringsproblem eftersom vi inte sagt att data
noder kan innehålla extra noder. firstname och lastname
är däremot ok.
xml9_2.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE person [
<!ELEMENT person (data*)>
<!ELEMENT data (#PCDATA|lastname|firstname)*>
<!ELEMENT lastname (#PCDATA)>
<!ELEMENT firstname (#PCDATA)>
<!ELEMENT extra (#PCDATA)>
]>
<person>
<data>
Hans förnamn är <firstname>Kalle</firstname> och efternamnet är
<lastname>Anka</lastname>
</data>
<data>
Jag vet bara hans efternamn, som är <lastname>Persson</lastname>
</data>
<data>
Vet inte alls vad han heter
</data>
<data>
Denna rad <extra>innehåller</extra> fel.
</data>
</person>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
Detta fungerar så att vi säger att data taggen kan innehålla
antingen PCDATA (tolkad text), firstname eller lastname. Observera att man även
får använda både firstname och lastname.
Denna metod kan vid första anblicken bryta mot hela XML:s grundidé,
men om vi ser den synvinkeln att såväl en människa som en dator
skall kunna läsa texten så kan det vara en god idé. Ur XML:s
synvinkel är det endast de två namntagsen som är av betydelse,
och dessa är lätta att plocka ut ur sammanhanget.
Vi kan gärna jämföra med webben och sökningar på
webben. Tag en titt på nedanstående mixed mode XML fil, tag sedan
en funderare över hur lyckade dina sökningar på webben brukar
vara. Om vi strukturerar det som behövs och skippar resten, kommer vi ändå
att få en bättre struktur än på webben.
xml9_3.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE cars [
<!ELEMENT cars (data*)>
<!ELEMENT data (#PCDATA|make|model|year|contact)*>
<!ATTLIST data type (sale|buy) #REQUIRED>
<!ELEMENT make (#PCDATA)>
<!ELEMENT model (#PCDATA)>
<!ELEMENT year (#PCDATA)>
<!ATTLIST year what (estimate|exact) #IMPLIED>
<!ELEMENT contact (#PCDATA)>
]>
<cars>
<data type="sale">
Jag vill sälja min gamla <make>Lada</make>
<model>Samara</model> som är inregistrerad
ungefär år <year what="estimate">1999</year>
Tag kontakt med <contact>Pelle Ek, tfn. 12345</contact>
</data>
<data type="sale">
<contact>Eva Petterson</contact> säljer sin
<make>Volvo</make> som
totalt obehövlig och oanvändbar
</data>
<data type="buy">
<contact>Kalle Ek</contact>
vill köpa en bil av årsmodell
<year what="exact">2000</year>
Helst en <make>Nissan</make> <model>Primera</model>
</data>
</cars>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
EMPTY
Man kan även säga att ett element måste vara tomt. I nedanstående
exempel måste father vara tomt och den senare data noden kommer
att förorsaka valideringsfel
xml9_4.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE persons [
<!ELEMENT persons (data*)>
<!ELEMENT data (name,father)*>
<!ELEMENT name (#PCDATA)>
<!ELEMENT father EMPTY>
]>
<persons>
<data>
<name>Kalle</name>
<father />
</data>
<data>
<name>Ville</name>
<father>Detta är fel</father>
</data>
</persons>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
Dett verkar ju rätt meningslöst vid första anblicken men om
du är van med html kodning kan du se nedanstående exempel, som (förhoppningsvis)
verkar vettigare:
xml9_5.xml
<?xml version="1.0" encoding="iso-8859-1" ?>
<!-- förenklad html-liknande DTD -->
<!DOCTYPE persons [
<!ELEMENT persons (data*)>
<!ELEMENT data (name,img)*>
<!ELEMENT name (#PCDATA)>
<!ELEMENT img EMPTY>
<!ATTLIST img src CDATA #REQUIRED
width CDATA #IMPLIED
height CDATA #IMPLIED>
]>
<persons>
<data>
<name>Kalle</name>
<img src="kallebild.gif" />
</data>
<data>
<name>Ville</name>
<img src="villebild.gif" width="200" height="200" />
</data>
<data>
<name>Anna</name>
<img src="annabild.gif">Vad gör detta här?</img>
</data>
</persons>
Om du har IE 5.0 eller nyare kan du klicka här för att se filen i praktiken
Här säger vi att vi skall ha en img tag men den måste
vara tom. Däremot kan vi ha några attribut. Jämför med
de bilder du - kanske - satt in på websidor. Brukar img taggen innehålla
data? Svar: Nej.