programmera.net -> webservice -> normal     för utskrift      info@programmera.net

XML Namespaces (Namnutrymmen)

1. Vad är Namnutrymmen?
2. Default namespace
3. Flera default namespace i samma dokument
4. Prefix

1. Vad är Namnutrymmen?

XML Namespaces (jag kallar detta för namnutrymme) är en teknik som går ut på att man ska kunna blanda element från olika dokumenttypsdeklarationer (XML-språk) i samma dokument. Namnutrymmen förhindrar krockar mellan element som råkar ha samma namn (men olika betydelse).

2. Default namespace

Ett vanligt sätt att använda namnutrymmen är att sätta ett default namespace, vilket är ett namnutrymme som gäller för alla element som ligger under det element där den deklarerades. För att ge ett exempel uppdaterar vi "Purchase Order" (från sidan  XML 1.0 ) med attributet xmlns. Hela dokumentet döps nu till po1.xml ser ut på följande sätt:

<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO" orderDate="1999-10-20">
  <comment>Hurry, my lawn is going wild<!/comment>
   <items>
      <item partNum="872-AA">
         <productName>Lawnmower</productName>
         <quantity>1</quantity>
         <USPrice>148.95</USPrice>
         <comment>Confirm this is electric</comment>
      </item>
      <item partNum="926-AA">
         <productName>Baby Monitor</productName>
         <quantity>1</quantity>
         <USPrice>39.98</USPrice>
         <shipDate>1999-05-21</shipDate>
      </item>
   </items>
</purchaseOrder>
Den intressanta raden är alltså:

<purchaseOrder xmlns="http://www.example.com/PO" orderDate="1999-10-20">
En viktig sak att poängtera är att den URI som attributet xmlns pekar ut inte behöver finnas, det är bara ett namn.

  • Analogi med Java: På samma sätt som Javaklasser kan ha samma namn om de ligger i olika paket kan det finnas flera element i ett XML-dokument med samma namn (men med olika funktion) om de ligger i olika namnutrymmen.

3. Flera default namespace i samma dokument

Om vi tänker oss att vi lägger till en adress ( <shipTo> ) som ska tillhöra ett annat namnutrymme till dokumentet po1.xml kan vi använda "default namespace" igen. Vi kallar den nya filen po2.xml, se nedan:

<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO" orderDate="1999-10-20">
   <shipTo xmlns="http://www.example.com/ADDR" country="US">
      <name>Alice Smith</name>
      <street>123 Maple Street</street>
      <city>Mill Valley</city>
      <state>CA</state>
      <zip>90952</zip>
   </shipTo>
   <comment>Hurry, my lawn is going wild<!/comment>
   <items>
      <item partNum="872-AA">
         <productName>Lawnmower</productName>
         <quantity>1</quantity>
         <USPrice>148.95</USPrice>
         <comment>Confirm this is electric</comment>
      </item>
      <item partNum="926-AA">
         <productName>Baby Monitor</productName>
         <quantity>1</quantity>
         <USPrice>39.98</USPrice>
         <shipDate>1999-05-21</shipDate>
      </item>
   </items>
</purchaseOrder>
För po2.xml gäller följande:

  • Alla element inanför <shipTo>, (d.v.s. <name>, <street>, ...) tillhör namnutrymmet http://www.example.com/ADDR.
  • Alla element som ligger utanför <shipTo> (d.v.s. <comment>, <items>, ...) tillhör namnutrymmet http://www.example.com/PO.
Alltså, ett default namespace som ligger innanför ett annat överrider det yttre.

4. Prefix

Ett alternativ till att använda default namespace är att använda prefix. Ett prefix är en liten förkortning som sätts framför elementnamnet för att signalera vilket namnutrymmet det tillhör, enligt följande syntax:

<prefix:element> ... </prefix:element>
Vi modifierar po2.xml så att prefix används för <shipTo> och kallar den nya filen po3.xml, se nedan:

<?xml version="1.0"?>
<purchaseOrder xmlns="http://www.example.com/PO" 
               xmlns:addr="http://www.example.com/ADDR"
               orderDate="1999-10-20">
   <addr:shipTo country="US">
      <addr:name>Alice Smith</addr:name>
      <addr:street>123 Maple Street</addr:street>
      <addr:city>Mill Valley</addr:city>
      <addr:state>CA</addr:state>
      <addr:zip>90952</addr:zip>
   </addr:shipTo>
   <comment>Hurry, my lawn is going wild<!/comment>
   <items>
      <item partNum="872-AA">
         <productName>Lawnmower</productName>
         <quantity>1</quantity>
         <USPrice>148.95</USPrice>
         <comment>Confirm this is electric</comment>
      </item>
      <item partNum="926-AA">
         <productName>Baby Monitor</productName>
         <quantity>1</quantity>
         <USPrice>39.98</USPrice>
         <shipDate>1999-05-21</shipDate>
      </item>
   </items>
</purchaseOrder>
po3.xml fungerar precis som po2.xml, det är bara olika sätt att skriva. På varje ställe där prefixet addr: används överrids defaultnamnutrymmet av namnutrymmet http://www.example.com/ADDR.

  • Rekommendation: Vad man bör använda är mest en smaksak, men om man har många olika namnutrymmen i sitt dokument är ofta prefix att föredra över default namespace eftersom det blir mycket tydligare vilket namnutrymme varje element tillhör.