Till startsidan för Jonas Webresurs

Attributdeklarationer i Xml

1. Inledning

Hittills har jag inte sagt någonting om hur man använder attribut i Xml. Det skall den här sidan därför handla om. Först berättar jag lite om när man använder attribut och sedan går jag in på hur de skall deklareras.

2. Elementtyper

Attribut ser ungefär likadana ut som i Html. De har värden, som skrivs innanför dubbla (") eller enkla (') citationstecken. Men attribut måste inte finnas i Xml och det går alltså alldeles utmärkt att strunta i dem.

Attribut kan ersätta element och tvärtom. Här är ett exempel på det:

<latar>
   <namn textforfattare="The Knife">Heartbeats</namn>
</latar>

Men vi hade lika gärna kunnat använda element i stället:

<latar>
   <namn>Heartbeats</namn>
   <textforfattare>The Knife</textforfattare>
</latar>

Hur vet man när man skall använda element eller attribut? En grundregel är att använda attribut då man har sporadiskt förekommande data. Det blir nämligen mycket enklare att överblicka dokumentstrukturen om man använder element.

Vissa använder attribut för att få ner mängden kod. Det kan kanske vara ett argument när man blivit skicklig på att skapa Xml-dokument. Attribut är nämligen också svårare att använda än i Html. I Xml är nämligen attributen knutna till ett visst element. Detta skall vi nu titta närmare på.

3. Deklarera attribut

I exemplet ovan använde vi attributet "textforfattare" och det såg ut så här:

<latar>
   <namn textforfattare="The Knife">Heartbeats</namn>
</latar>

Ett sådant attribut måste definieras i deklarationen. man skriver då så här:

<!ELEMENT latar (namn)>
<!ELEMENT namn (#PCDATA)>
<!ATTLIST namn textforfattare CDATA #IMPLIED>

Elementet <latar> innehåller elementet <namn>, som i sin tur innehåller ett textinnehåll. "PCDATA" står ju för "Parsed Character Data" och betyder ungefär "analyserad data". Textinnehållet skall alltså analyseras eller kontrolleras av det program som används för att läsa Xml-dokumentet.

Detta sätt att skriva känner vi till sedan tidigare. Nytt är däremot raden som börjar med ATTLIST-elementet. ATTLIST står för "AttributLISTa" och används alltså för att ange en lista med alla attribut som förekommer i elementet.

Här definierar jag alla attribut till elementet <namn>:

<!ATTLIST namn textforfattare CDATA #IMPLIED>

I listan förekommer bara ett attribut, nämligen "textforfattare". Det åtföljs av två beskrivningar: CDATA och #IMPLIED.

CDATA står för "Character Data" och talar om att attributet är en vanlig text (kallas ibland för "textsträng"). I det här fallet blir texten namnet på den som skrivit texten till låten.

IMPLIED talar om att attributet kan förekomma i elementet, men att det inte behöver göra det. Jag återkommer till vad dessa två beskrivningar betyder längst ner på den här sidan.

Om man vill använda flera attribut skriver man dem under varandra så här:

<!ELEMENT namn (#PCDATA)>
<!ATTLIST namn
   textforfattare CDATA #IMPLIED
   nationalitet CDATA #IMPLIED
>

Enda skillnaden är då att man inte avslutar ATTLIST förrän alla attribut är färdigdeklarerade. Ett bra sätt att avsluta på är att skriva ">" på första raden under sista attributet.

4. Attributkategorier

I förra exemplet deklarerade vi ett attribut som CDATA:

<!ELEMENT namn (#PCDATA)>
<!ATTLIST namn textforfattare CDATA #IMPLIED>

CDATA är en attributkategori som talar om hur attributets värde skall behandlas. De vanligaste kategorierna är följande:

CDATA Står som sagt för "Character Data" och anger att attributets värde skall behandlas som vanlig text.

ID Står för "Identifier" och attributets värde är ett unikt identifikationsnummer eller ID-nummer. Med attributet kan man göra elementen unika. Man får nämligen inte använda samma värden till olika ID-attribut i samma dokument.

Det kan t.ex se ut så här:

<!ELEMENT titel (#PCDATA)>
<!ATTLIST titel serienummer ID #REQUIRED>

IDREF, IDREFS Dessa båda attribut är "kusiner" till ID. Med IDREF kan man referera till ett visst element via dess ID-värde. Med IDREFS kan man i stället hänvisa till flera ID-märkta element samtidigt.

ENTITY, ENTITIES Båda dessa används för att hänvisa till tecken eller texter som inte skall analyseras eller tolkas. Man kan bl.a använda dessa attribut för att skapa kortkommandon för funktioner eller texter som ofta används. Jag tar upp entiteter på en särskild sida.

NMTOKEN, NMTOKENS Man använder dem för att lägga in värden till ett "namn". Namnet kan vara vad som helst, ett textinnehåll, ett attribut eller ett element. Jag kommer att återvända till dessa attribut på senare sidor.

5. Mer om attributvärden

Enligt Xmls syntaxregler måste värden alltid börja med en bokstav eller ett understrykningstecken (eller ibland ett kolon, men det är inte så bra, vilket förklaras på sidan om namnutrymmen). Man får alltså skriva sådana här värden:

<namn textforfattare="The Knife">
<namn textforfattare="_The Knife">

men inte sådana här

<namn textforfattare="-The Knife">
<namn textforfattare=" The Knife">
<namn textforfattare="2004: The Knife">

Men vad gör vi då om vi inte vill använda alla möjliga värden, utan blott vissa utvalda? Då kan vi skapa en förteckning ("enumerated list" på engelska) över dessa:

<!ELEMENT artist (#PCDATA)> <!ATTLIST artist nationalitet (svensk | engelsk | amerikansk) #IMPLIED>

Här talar vi om att elementet <namn> har ett attribut, "nationalitet", som endast får ha värdena "svensk" eller "engelsk" eller amerikansk". Vi skriver sedan i koden:

<artist nationalitet="svensk">José González</artist>

Använder man något otillåtet värde så kommer läsaren att tala om det genom att visa ett felmeddelande. Antingen säger läsaren att den inte kan analysera sidan p.g.a för lite ledigt minne – analysen av Xml-koden tar ofta mycket datorkraft i anspråk. Eller säger läsaren att sidan är felaktig.

Titta på ett felaktigt exempel >

Självklart kan alla eller bara vissa attribut i ett element ha en sådan förteckning över olika värden:

<!ELEMENT namn (#PCDATA)>
<!ATTLIST namn
   textforfattare CDATA #IMPLIED
   nationalitet (svensk | engelsk | amerikansk) #IMPLIED
>

Om man vill tala om att ett visst värde är det enda tillåtna, skall man i stället skriva så här:

<!ELEMENT artist (#PCDATA)>
<!ATTLIST artist namn #FIXED "José González">

Observera dock att sådana värden är stavningskänsliga. Man kan sedan inte stava namnet annorlunda, utan måste följa den konvention man skapat. Attribut och element är ju alltid stavningskänsliga.

Utifrån dessa regler kan man sedan skapa olika kombinationer:

<!ELEMENT artist (#PCDATA)>
<!ATTLIST artist nationalitet (svensk | engelsk | amerikansk) "svensk">

Denna regel innebär att defaultvärdet är "svensk" om man inte skriver in det, Ändrar man får man skriva in "engelsk" eller "amerikansk" också.

6. REQUIRED och IMPLIED

Till slut vill jag säga lite om REQUIRED och IMPLIED. Genom att använda REQUIRED säger man att attributet måste finnas med:

<!ELEMENT namn (#PCDATA)>
<!ATTLIST namn textforfattare CDATA #REQUIRED>

När man använder REQUIRED får man emellertid inte samtidigt bestämma ett defaultvärde till attributet.

IMPLIED säger att attributet inte måste finnas med då elementet används. Man använder den då det inte finns något bestämt värde, t.ex som i följande:

<!ELEMENT namn (#PCDATA)>
<!ATTLIST namn textforfattare CDATA #IMPLIED>

Det är i princip bara då man har definierat vilka värden som får finnas med som REQUIRED och IMPLIED kan uteslutas. Dessa båda exempel får illustrera detta:

<!ATTLIST artist nationalitet #FIXED "svensk">
<!ATTLIST artist nationalitet (svensk | engelsk | amerikansk) "svensk">

På sidan om Dokumentstrukturer visade jag ett exempel på ett Xml-dokument. Här har jag byggt på det med några attribut.

Titta på exemplet >
Titta på koden till exemplet >


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