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:
Den intressanta raden är alltså:
<?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>
En viktig sak att poängtera är att den URI som attributet xmlns pekar ut inte behöver finnas, det är bara ett namn.
<purchaseOrder xmlns="http://www.example.com/PO" orderDate="1999-10-20">
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:
För po2.xml gäller följande:
<?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>
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:
Vi modifierar po2.xml så att prefix används för <shipTo> och kallar den nya filen po3.xml, se nedan:
<prefix:element> ... </prefix:element>
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.
<?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>