namespaces

18
1 Namespaces -Att kunna blanda XML- vokabulärer i samma instansdokument

Post on 21-Oct-2014

2.191 views

Category:

Technology


0 download

DESCRIPTION

namespaces

TRANSCRIPT

Page 1: Namespaces

1

Namespaces

-Att kunna blanda XML-vokabulärer i samma

instansdokument

Page 2: Namespaces

2

Vad är namespaces?

• Ett sätt att kunna blanda olika XML-vokabulärer i samma dokument.

• Bra för att kunna tillåta lokala utbyggnader av vokabulärer, t.ex. om ett företag i stort kan använda en viss vokabulär för något syfte, men saknar något.

• Även bra i webbsammanhang, där man t.ex. kan bädda in svg-kod i html-kod, eller kan göra länkar med xlink (båda fungerar i Firefox)

Page 3: Namespaces

3

Hur gör man?

• Man ”binder” ett visst prefix till en viss vokabulär (≈DTD).

• Elementnamn som föregås av detta prefix följt av ett kolon tillhör just den vokabulären.

• Elementnamn som föregås av annat (eller inget) prefix tillhör någon annan vokabulär.

Page 4: Namespaces

4

Exempel 1. Enkel användning av namespace

<imf:some-element xmlns:imf=”http://ifra.com/imf/”>

<title> default namespace </title> <imf:title> Från namespacen imf </imf:title></imf:some-element>

Page 5: Namespaces

5

Vilket prefix?

• Man väljer själv i XML-instansen (=XML-dokument) vilket prefix man vill välja för en viss vokabulär.

• Dock finns många vokabulärer där man brukar använda vissa prefix.– svg: för Scalable Vector Graphics– xsd: för XML Schema Definition– fo: för XSL Formatting Objects

Page 6: Namespaces

6

Exempel 2. Prefixval

• Nedanstående är identiskt som exempel 1, men med annat valt prefix

<banan:some-element xmlns:banan”http://ifra.com/imf/”>

<title> default namespace </title> <banan:title> Från namespacen imf </banan:title></banan:some-element>

Page 7: Namespaces

7

Default namespace

• Det går även att ange en namespace som ska gälla utan att elementen behöver föregås av prefix.

• Detta görs genom att använda attributet xmlns utan något postfix.

Page 8: Namespaces

8

Exempel 3: Default Namespace

<imf xmlns=”http://foo.com/bar”> <title> Från namespacen http://foo.bar </title></imf>

• Namespacen gäller alla icke-prefixade ättlingar till elementet där namespacen deklareras.

Page 9: Namespaces

9

Prefix och bindning

• Prefixet binds genom attributet xmlns följt av :prefixnamn.

• Prefixet kan vara ett ”XML name” (se boken).

• I instansdokument kallas strängen före kolon för prefix, strängen efter kolon för local part och hela strängen för qualified name.

Prefix Local part

Qualified name

<imf:title>

Page 10: Namespaces

10

Vad är ”namespacen”

• En namespace är en URI (http://…, ftp://… etc)• Det viktiga är att URIn är unik, dvs att ingen

annan använder just den URIn. Därför brukar man välja en namespace-URI i en domän man har kontroll över.

• URIn behöver inte peka på något faktiskt dokument, men det skadar inte. Många parsers letar efter en DTD/Schema på URIn om inget annat anges.

Page 11: Namespaces

11

Binda en namespacetill en verklig URI-resurs

• Det går även att binda en namespace till en URI som är en annan än namespace-URIn.

• Detta kan göras med attributet schemaLocation som finns definierad i namespacen XMLSchema-instance,som brukar bindas till prefixet xsi

• Syntaxen är ganska grötig, se följande exempel.

Page 12: Namespaces

12

Exempel 4. Binda namespaces till en URI

<imf xmlns="http://ifra.com/imf” xmlns:demo=”http://demo.com/imf” xmlns:xsi= ”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation="http://demo.com/imf http://foo.se/demo.xsd http://ifra.com/imf http://foo.se/imf.xsd">

• Default namespace ärhttp://ifra.com/imf som binds till adressen http://foo.se/imf.xsd.

• Namespacen http://demo.com/imf binds till adressen http://foo.se/demo.xsd

Page 13: Namespaces

13

Scope

• Ett prefix/namespace är giltigt i elementet det deklareras i samt dess ättlingar (dvs barn, barnbarn osv).

Page 14: Namespaces

14

Exempel 5: Scope

html

head body

title

root

p svg:svg

svg:titlesvg:image

p

Här deklarerasnamespacen

Giltighets-område

Page 15: Namespaces

15

Validering med DTD

• Att validera ett dokument som använder olika namespaces är inte helt trivialt.

• DTD-definitionerna måste tillåta att element från andra namespaces får förekomma på vissa bestämda eller obestämda platser.

• I en DTD måste ett qualified name användas i själva deklarationen.

• Detta betyder att själva valet av prefix har betydelse.

• Detta är en klumpig lösning.

Page 16: Namespaces

16

Exempel 6:Validering med DTD

<!ELEMENT foo (svg:svg | head) ><!ATTLIST foo xlink:type CDATA

#IMPLIED>

Page 17: Namespaces

17

Validering med XML Schemas

• XML Schemas har bättre möjligheter att blanda olika namespaces och fortfarande kunna validera instansdokument.

• Mer om detta senare.

Page 18: Namespaces

18

Riktigt exempel (ganska)<imf xmlns="http://www.ifra.com/imf”xmlns:demo="http://www.demo.com/imf"><object action="modify"> <PrintingJob/> <object_uid>17</object_uid> <activities> <activity> <demo:Printing>on_hold</demo:Printing> <reason>web break</reason> </activity> </activities> </object></imf>