Formáli / Inngangur

Jæja þá er loksins komið að því, XML Part II er loksins komin. Það var komin tími til að fara setjast niður og koma þessu gang, nú er skólinn búinn og því engar afsakanir lengur.

Í Part I fór ég yfir hvað XML gerir og hver munurinn á XML og HTML er, þá fór ég yfir helstu hugtök eins og document prolog, root elment, node, svo áfram mætti telja. Að lokum gerði ég síðan well-formed memo.

Ég mæli með að þið lítið hratt yfir Part I (sérstaklega þeir sem ekki lásuð þá grein) áður en þið haldið áfram svo þið vitið ábyggilega hvað er um að vera. Einnig skulið þið gera ykkur grein fyrir að ég nota < > þegar um hornklofa er að ræða og [ ] þegar um það er að ræða.

Jæja, þá er okkur ekki til setunar boðið og því byrjum við.

Valid XML

Nú tökum við memo dæmið sem við höfðum í Part I og gerum það að Valid XML. Eins og kom fram í Part I þá, veit browserinn í rauninni ekki hvort þetta sé rétt, þ.e.a.s að innan elementsins <memo> eigi að vera <til>, <fra> og <innihald>. Þetta byrjuðum við með í Part I og því ágætt að byrja með þetta í Part II líka.

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<memo>
<til>Allra hugaðra manna</til>
<fra>ask</fra>
<innihald>
Vonandi á þessi grein eftir að hjálpa eitthvað í framtíðinni

kv.
ask
</innihald>
</memo>

Semsagt, þá veit browserinn bara að þetta er rétt uppsett samkvæmt XML reglum (Well formed), það er að segja, rétt nestað, lower case og svo framvegis (sjá reglurnar í “XHTML er málið”). En hann veit ekki eins og í HTML-i að <tr> megi bara vera undir <table> og undir <tr> verði að koma <td>. Þetta er munurinn á well-formed og valid.

Document Type Definition

Til þess að gera XML skjalið okkar valid, þurfum við DTD (Document Type Definition), athugið samt að XML Schema er í skoðun/þróun hjá W3 Consortium og er mjög líklegt að það taki við DTD, en þar sem DTD er staðallinn núna förum við í hann.

DTD segir til um hvaða element megi vera undir hvaða elementi. DTD útskýrir semsagt uppbyggingu skjalsins.

Þið hafið flest séð DTD í HTML skjölum (Sjá “Gerðir HTML-sins”). Þar sem ekkert XML skjal er eins, þurfum við að búa til okkar eigin DTD og við skrifum:

<!ELEMENT memo (til, fra, innihald)>

Þarna sagði ég einfaldlega: Elementið <memo> á að innihalda elementin <til>, <fra> og <innihald>. En hvað eiga þá <til>, <fra> og <innihald> að innihalda, þau innihalda jú texta.

Í DTD er til tvenns konar texti. PCDATA sem er Parsed Character Data og CDATA sem er Character Data. Í PCDATA eru tög tekin sem markup og entity virka, dæmi um entity er nonebreakable space ( ). Í CDATA eru tög ekki tekin sem markup og entity virka ekki.
Þá skrifum við

<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>

Þá lítur DTD-ið (yfirlýsingin) okkar svona út.

<!ELEMENT memo (til, fra, innihald)>
<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>

Þá er að tengja þetta við XML skjalið, við það eru tvær leiðir:
1. Afrita kóðan inn í xml skjalið
2. Vísa í DTD skjalið. - sama hugsun og með CSS

NR 1
Þá er kóðinn svona
<!DOCTYPE root-element [yfirlýsingin]>

Sem verður þá

<!DOCTYPE memo [
<!ELEMENT memo (til, fra, innihald)>
<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>
]>

Þessi kóði er síðan settur fyrir neðan XML Prolog-ið

NR 2 - ég er hrifnari að þessari leið, því þá geturu haft eitt miðlægt dtd skjal.
Þá er hægt að skella þessum kóða efst í skjalið.

<!DOCTYPE root-element SYSTEM “slodognafn”>

Sem verður þá:

<!DOCTYPE memo SYSTEM “dtd/memo.dtd”>

Þá er það komið. Skjalið sem við erum búin að gera ætti að líta svona út.

NR 1

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE memo [
<!ELEMENT memo (til, fra, innihald)>
<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>
]>
<memo>
<til>Allra hugaðra manna</til>
<fra>ask</fra>
<innihald>
Vonandi á þessi grein eftir að hjálpa eitthvað í framtíðinni

kv.
ask
</innihald>
</memo>

NR 2

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE memo SYSTEM “dtd/memo.dtd”>
<memo>
<til>Allra hugaðra manna</til>
<fra>ask</fra>
<innihald>
Vonandi á þessi grein eftir að hjálpa eitthvað í framtíðinni

kv.
ask
</innihald>
</memo>

Þá er það komið, næst er þá bara að vinda sér í attribute í XML og DTD

Attributes

Eins og þið vitið er hægt að búa til sín eigin tög í xml, og þar af leiðandi ætti það að vera augljóst að hægt er að gera sín eigin attribute. Ef við breytum nú aðeins skjalinu okkar.

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE memo [
<!ELEMENT memo (til, fra, innihald)>
<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>
]>
<memo importance=“high”>
<til>Allra hugaðra manna</til>
<fra>ask</fra>
<innihald>
Vonandi á þessi grein eftir að hjálpa eitthvað í framtíðinni
<kvedja>
heyrumst
ask
</kvedja>
</innihald>
</memo>

Eins og þið sjáið liggur breytingin í root-elementinu memo, en ég bætti inn attribute-inu importance.

Nú eruð þið sjálfsagt að hugsa: “En núna er DTD-ið ekki rétt, ó shit, nú er allt í fokki”. Og það er alveg rétt hjá ykkur. XML-ið er ekki lengur valid, DTD skjalið lýsir ekki þessu attribute-i importance. Er þá nokkuð annað en að fixa það í hið snarasta.

Byrjum á að hugsa þetta aðeins… elementið memo á að innihalda attribute-ið importance, sem síðan hefur ákveðin gildi. Útfrá því skrifum við síðan:

<!ATTLIST memo importance (low|medium|high) “medium”>

Þarna sagði ég: Í elementinu memo er attribute-ið importance. Það hefur síðan gildin low, medium og high. Medium er default gildið. Munið að það þarf að vera kvótað. Semsagt eitthvað annað value en low, medium og high er vitlaust. Merkið | lýsir alltaf ástandinu “annaðhvort eða”.

Þá lýtur þetta svona út:

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE memo [
<!ELEMENT memo (til, fra, innihald)>
<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>
<!ATTLIST memo importance (low|medium|high) “medium”>
]>
<memo importance=“high”>
<til>Allra hugaðra manna</til>
<fra>ask</fra>
<innihald>
Vonandi á þessi grein eftir að hjálpa eitthvað í framtíðinni
<kvedja>
heyrumst
ask
</kvedja>
</innihald>
</memo>

Smá hugsun

Ef þið ímyndið ykkur DTD skjal sem lýsir basic uppbyggingu XML skjals, væri brilliant að hafa það miðlægt (NR 2) og svo inn í XML skjalinu (NR 1) nánari lýsingu á XML-inu. Þannig að það er eitt DTD skjal sem lýsir yfirbygginguni sem er miðlægt og kóðinn sem lýsir skjalinu nánar er í skjalinu sjálfu. Eins og ef að ekki öll memo væru með attribute-ið importance.

Þá væri hægt að hafa miðlægt dtd skjal.
<!ELEMENT memo (til, fra, innihald)>
<!ELEMENT fra (#PCDATA)>
<!ELEMENT til (#PCDATA)>
<!ELEMENT innihald (#PCDATA)>

Sem héti þá memo.dtd

Og svo skjalið sjálft:

<?xml version=“1.0” encoding=“ISO-8859-1”?>
<!DOCTYPE memo SYSTEM “memo.dtd” [
<!ATTLIST memo importance (low|medium|high) “medium”>
]>
<memo importance=“high”>
<til>Allra hugaðra manna</til>
<fra>ask</fra>
<innihald>
Vonandi á þessi grein eftir að hjálpa eitthvað í framtíðinni
<kvedja>
heyrumst
ask
</kvedja>
</innihald>
</memo>

Þannig að þau memo sem ekki eru með attribute-ið importance vísi bara í miðlægt dtd en hafi ekki internal skilgreiningu.
Þetta er þó bara hugdetta sem mér datt í hug, og væri helvíti sniðug og þægileg.

Þegar fyrri kóðinn er save-aður sem memo.dtd og sá seinni sem memo.xml og memo.xml síðan opnað í IE 5.X þá koma ekki upp neinar villumeldingar. Þannig það ætti að virka. En samt eins og ég segi, ég hef ekki séð þetta gert og þetta er bara eitthvað sem mér datt í hug, en djöfull væri það sniðugt og handhægt.

Lokaorð

Jæja þá erum við búin að fara í Valid XML og basic-ið af DTD. Ef þið hafið farið í gegnum XML Part I og svo þennan part, þá ættuð þið að geta byrjað að leika ykkur alvarlega.

Farið inn á netið og finnið flott dæmi, skoðið kóðan, download-ið frá hotscripts og svo framvegis. Leiðbeiningarnar og útskýringarnar á ensku ættu ekki að vera eins erfiðar, eða það vona ég að minnst kosti, því þið ættuð að vera búin að læra meira en nóg til þess að fikta ykkur áfram.

Að lokum ætla ég að biðja ykkur ekki að örvænata ekki, því að Part III er á leiðinni, þá bý ég til stórt xml skjal, og fer þá dýpra í DTD. Þarna verður alvaran tekin fyrir. Það verður þá svona meira sýningar grein, heldur en kennslu grein, svona til þess að fínpússa og endalega fara yfir XML-ið.

Þangað til…

kv.
ask