Till startsidan för Jonas Webresurs

Entiteter i Xml

1. Inledning

Den här sidan berättar om vad entiteter är och hur de används i Xml. Du får också lära dig hur man deklarerar entiteter i en DTD.

2. Vad är entiteter?

Ordet "entitet", eller "entity" på engelska, brukar användas för att ange olika specialtecken eller textsträngar.

Det finns fyra huvudgrupper av entiteter:


  • Inbyggda tecken
  • Specialtecken (se avsnitt 3)
  • Generella tecken (se avsnitt 4)
  • Parametertecken (se avsnitt 5)

Som synes kommer jag att berätta om dem i tur och ordning. jag börjar med inbyggda tecken. På engelska kallas de "built-in entities" och är sådana som alla Xml-läsare klarar av, både att tolka och att visa. Listan nedan över sådana tecken är väl också välkänd för de flesta som sysslar med webbkodning:

entitet
(entity)
teckenkod
(entity reference)
< &lt;
> &gt;
& &amp;
' &apos;
" &quot;

Dessa tecken behöver man inte definiera alls då man skriver Xml-kod. De är ju inbyggda. Det betyder också att de inte går att förändra och ge nya betydelser. Däremot får man gärna använda dem och deras teckenkoder ihop:

<latar textforfattare="&quot;The Knife&quot;">

går ju att skriva, eftersom läsaren då tolkar citationstecknen som behållare för värdet och visar " som ett citationstecken. Det hela fungerar alltså precis som i Html.

3. Specialtecken

Den andra gruppen av entiteter är specialtecknen, eller "character entities" som de heter på engelska. Dessa behöver inte heller definieras i DTD:n, men däremot kan man sällan skriva dem direkt i dokumentet. I stället måste man använda deras teckenkod.

Den svenska bokstaven "å" är ett exempel på en sådan entitet. För att läsaren skall visa bokstaven måste man skriva koden &#229;. Detta känner du igen från Html, även om teckenkoden där var &aring;.

På sidan "ISO-8859-1" berättade jag om de tecken som är specialtecken i Html. Läs mer här >

I Xml är dessa tecken många fler. Anledningen till det är att Xml använder en annan och mer modern teckenstandard än Html. I Xml heter den UTF. Eftersom den är standard behöver man egentligen inte ange den i sitt dokument (även om jag rekommenderar det). Följande instruktioner ger alltså samma uppsättning tecken:

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>

UTF står för "Universal Transformation Format" och är en variant av Unicode. Unicode är en internationell teckenstandard, "Unicode Worldwide Character Standard", som används för att representera alla tecken och symboler i alla jordens språk med binär kod. Unicode har en egen webbplats på www.unicode.org.

Unicode växer i takt med att fler och fler tecken läggs till. Hittills har man lyckats representera fler än 35.000 olika tecken från ungefär 25 olika alfabet. I webbsammanhang räcker det dock inte med bara bokstäver, så man har även lagt till en lång rad olika tecken, symboler och liknande.

UTF följer teckenstandarden Unicode 3.0 och är speciellt anpassad för Xml. Den finns i två olika varianter, UTF-16 och UTF-8.

UTF-16 ger varje tecken en särskild teckenkod (character code), vilken utgörs av ett 16 bitar långt värde. Totalt kan 65.535 (2 upphöjt till 16) olika tecken representeras i detta system. Skulle man behöva fler kan olika värden kombineras för att skapa 31-bitarsvärden (2 upphöjt till 31). Detta anses räcka för världens alla alfabet, tecken, symboler och liknande.

UTF-8 skiljer sig lite grand från UTF-16 genom att tilldela tecken värden på något olika sätt. Man kan säga att där UTF-16 tilldelar bitvärden för samtliga tecken, använder UTF-8 både bit- och bytevärden. UTF-8 utgår nämligen från Ascii (bytevärden) och ger alla tecken utöver denna bitvärden.

Följaktligen är inte UTF-8 lika omfångsrikt som UTF-16, sett till antalet möjliga tecken, men är i gengäld mer kompatibelt med hur olika datorsystem hanterar tecken. Detta är också anledningen till varför många tecken och teckenkoder är gemensamma i Xml och Html. Html utgår ju också ifrån en teckenstandard (iso 8859-1) som utgår ifrån Ascii.

4. Generella entiteter

Generella entiteter (general entities) kallas så eftersom de utgör en grupp av entiteter vars betydelse man bestämmer i princip själv. oftast handlar det dock inte om enskilda tecken utan om längre textsträngar, som vi skall se.

I DTD:n deklareras generella entiteter enligt följande princip:

<!ENTITY namn "text">

Man skulle därför kunna deklarera följande entitet:

<!ENTITY inledning "Välkommen till Jonas Webresurs!">

I dokumentet skriver man sedan:

&inledning;

vilket gör att läsaren presenterar följande på sidan:

Välkommen till Jonas Webresurs!

Längden på texten är inte begränsad och man får alltså lägga in hur mycket text man vill som entitet. Av praktiska skäl kan det dock vara lämpligt att placera långa texter i särskilda filer:

<!ENTITY inledning SYSTEM "inledning.txt">

Deklarationen av entiteten "inledning" ligger alltså i en extern fil. SYSTEM känner du igen sedan tidigare och innebär ju att filen används för endast det här dokumentet. Om man vill kan man också ange den fullständiga internetadressen till filen. Det är ju nödvändigt om filen ligger på en annan server.

Förutom att använda text kan man även lägga in andra tecken:

<!ENTITY ordsprak "&quot;En intelligent person förstår sig på andra människor. Det krävs ett geni för att förstå sig på sig själv&quot;">

I texten skriver man sedan:

Det kinesiska ordspråket lyder &ordsprak; och det tycker jag stämmer bra!

Om man vill kan man även lägga in element och annan kod i en entitetsdeklaration:

<!ENTITY ordsprak "<citat>&quot;En intelligent person förstår sig på andra människor. Det krävs ett geni för att förstå sig på sig själv&quot;</citat>">

Självklart måste man också deklarera detta element på vanligt sätt. Men med detta enkla hjälpmedel kan man alltså underlätta arbetet för sig själv. Man kan också få ner mängden kod avsevärt.

Jag har gjort ett litet exempel på en generell entitet, som du hittar här nedan. Jag har utgått ifrån samma exempel som tidigare och markerat alla nyheter med rött:

Kolla på koden >
Kolla på exemplet >

5. Parameterdata

Parameterentiteter används på ungefär samma sätt som generella entiteter. Skillnaden är att datan i det här fallet utgörs av hela eller delar av DTD:er. Fler olika DTD:er kan på så sätt pusslas ihop till en större, någor som är praktiskt då flera olika personer ansvarar för en del av DTD:n. En DTD som är uppbyggd av flera separata filer kallas "modulerad" (modular på engelska).

Entiteter i form av parametrar deklareras så här:

<!ENTITY % entitetsnamn "parameterdata">

Använt i en DTD skulle det kunna se ut så här:

<!ENTITY % default "Sverige">

Procenttecknet måste stå ensamt, med blanksteg på var sin sida. Det talar om att det är en parameter. Här har jag skapat en som heter "default" och den text som skall vara defaultland är "Sverige".

ofta använder man parameterentiteter för att underlätta för sig själv då man skriver sin DTD. Ta följande exempel:

<!ELEMENT cd (genre, artist, utgivningsar, bolag, titel, latar*)>

Du känner igen det från tidigare sidor. om vi nu tänker oss att vi inte bara skulle deklarera elementet <cd> utan även flera olika mediatyper:

<!ELEMENT cd (genre, artist, utgivningsar, bolag, titel, latar*)>
<!ELEMENT kassett (genre, artist, utgivningsar, bolag, titel, latar*)>
<!ELEMENT mp3 (genre, artist, utgivningsar, bolag, titel, latar*)>

så skulle koden bli lite rörig och dessutom onödigt krånglig. Ett sätt att förenkla för sig själv kan man då i stället använda parameterdata:

<!ENTITY % elementlista "(genre, artist, utgivningsar, bolag, titel, latar*)">
<!ELEMENT cd %elementlista;>
<!ELEMENT kassett %elementlista;>
<!ELEMENT mp3 %elementlista;>

Här hämtar %elementlista; alltså parameterdatan från deklarationen i ENTITY. Till skillnad från andra entiteter använder man alltså procenttecken i stället för &-tecknet.

Obs!
Detta fungerar emellertid inte i alla XML-läsare, så kontrollera noga innan du går över till denna metod.

Jag har gjort ett litet exempel på en generell entitet, som du hittar här nedan. Jag har utgått ifrån samma exempel som tidigare. Eventuellt klarar en vanlig webbläsare inte av att tolka parameterdatan, vilket resulterar i ett felmeddelande. Men du kan ju alltid kolla på koden:

Kolla på koden >
Kolla på exemplet >

6. Notation-deklarationen

Det går alldeles utmärkt att använda multimediafiler som entiteter, i stället för bara vanlig text. Men man kan inte lägga in en sådan entitet på vanligt sätt. Följande deklaration kommer alltså inte att bli rätt:

<!ENTITY inledningsbild "bildrubrik.gif">

Anledningen är att Xml-läsaren då skulle försöka tolka innehållet i filen. För att undvika det måste man göra vissa tillägg till entitetsdeklarationen, enligt följande:

<!ENTITY inledningsbild SYSTEM "bildrubrik.gif" NDATA gif>

NDATA står för "Notation Data" och anger att datan i filen bildrubrik.gif inte skall tolkas utan endast visas eller hänvisas till.

Men sedan måste denna deklaration kopplas samman med ytterligare en deklaration, som talar om vad "gif" står för och vilket program som skall hantera denna filtyp. Det hela ser ut så här:

<!NOTATION gif SYSTEM "explorer.exe">
<!ENTITY inledningsbild SYSTEM "bildrubrik.gif" NDATA gif>

Problemet här är ju att alla inte använder Explorer för att visa gif-bilder eller kanske använder en programfil som inte har extensionen "exe". Notation-eklarationen kan dock vara bra att känna till och jag kommer att återkomma till den då jag skriver mer om multimediafiler i Xml.


Den här sidan är en del av Jonas Webresurs - www.jonasweb.nu - copyright © 1998-2011