DTD
DTD-filer kan fort bli ganske kompliserte. Det er til stor hjelp å ha et verktøy som gjør det mulig å validere forløpende og det er til enda større hjelp å ha et verktøy som generer DTD filer for XML-eksempler. XMLSpy kan gjøre begge deler.
Selv om vi bruker et slikt verktøy eller ikke, så har vi bruk for å gjøre håndarbeid på DTD-fila. Nedenfor finner du litt enkel førstehjelp
Elementer
Et element defineres som en gruppe av subelementer eller subgrupper:
<!ELEMENT A (B,C)>
<!ELEMENT A (#PCDATA)> <!ELEMENT A EMPTY> <!ELEMENT A ANY>
EMPTY betyr at det ikke skal være noen barn til noden. ANY betyr at noden kan inneholde ingen eller flere noder av en hvilken som helst type som er dfinert i dokumentet. PCDATA står for Parsed Character DATA og er en terminologi hentet fra SGML. I praksis betyr dette tekst, i en eller annen form.
Grupper kan være sekvenser eller de kan være valgfrie
<!ELEMENT A (B)> <!ELEMENT A (B,C)> <!ELEMENT A (B | C)> <!ELEMENT A (B, (C | D), E> <!ELEMENT A (B | C | (D,E))> |
# B B før C B eller C B før C eller D B eller C eller sekvensen D E |
Grupper kan merkes som valgfrie (?), en-eller-flere (+), ingen-eller-noen (*).
<!ELEMENT A (B?, C)> <!ELEMENT A (B, (C | D)+, E> <!ELEMENT A (B,C)*>
Character data kan sidestilles med subgrupper:
<!ELEMENT A (#PCDATA | B | C)*>
Atributter
Elementer kan ha ingen eller flere atributter
<!ATTLIST A a CDATA #IMPLIED>
Flere atributt angivelser kan skrives i samme angivelse eller hver for seg:
<!ATTLIST A a CDATA #IMPLIED b CDATA #IMPLIED> .. <!ATTLIST A a CDATA #IMPLIED> <!ATTLIST A b CDATA #IMPLIED>
Atributter kan være obligatoriske (REQUIRED), valgfrie (IMPLIED)eller et valg mellom spesifiserte verdier (FIXED). Valgfrie atributter kan ha en default verdi, spesifiserte må ha en default verdi.
<!ATTLIST A a CDATA #IMPLIED> <!ATTLIST A a CDATA "aaa"> <!ATTLIST A a CDATA #REQUIRED> <!ATTLIST A a CDATA #FIXED "aaa">
Entities
Entities kan vi betrakte som enheter som kan defineres og plasseres inn i en XML-fil når den parses. F.eks. kan vi lage følgende XML-fil:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE bok SYSTEM "dok1.dtd"> <bok> <tittel> En bok </tittel> <forfatter> &meg_selv; </forfatter> </bok>
Med følgende DTD:
<?xml version="1.0" encoding="ISO-8859-1"?> <!ELEMENT tittel (#PCDATA)> <!ELEMENT bok (tittel,forfatter)> <!ELEMENT forfatter (#PCDATA)> <!ENTITY meg_selv "Børre Stenseth, Høgskolen i Østfold">
Dette går bra i MSIE:
Dersom vi skal he det til å fungere i Mozilla, må vi plassere entiteten eksplisitt i selve XML-fila:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE bok SYSTEM "dok1.dtd"[<!ENTITY meg_selv "Børre Stenseth">]> <bok> <tittel> En bok </tittel> <forfatter> &meg_selv; </forfatter> </bok>
Dersom vi gjør begge deler, virker det i både MSIE og Mozilla:
Det fungerer altså som en replace, og kan typisk sammenlignes med en konstantdefinisjon i et programmeringsspåk som C. Vi kan definere eksterne entities og importere hele filer ved denne teknikken.
Standard entities
I XML er det definert følgende standard, eller predefinerte, entities:
- < for mindre enn, eller åpningsparentesen i elementer: <
- > for større enn, eller avslutningsparentesen i elementer: >
- & for &
- " for doble anførselstegn: "
- ' for enkel apostrof: '