<Order xmlns="http://schemas.devxpert.com/order">
<OrderId>2093324</OrderId>
<RequiredDate>2001-08-01</RequiredDate>
<ShipName>Yasser Shohoud</ShipName>
<OrderDetails>
<OrderItem>
<ProductID>53034</ProductID>
<Quantity>9</Quantity>
<UnitPrice>12.09</UnitPrice>
</OrderItem>
<OrderItem>
<ProductID>66090</ProductID>
<Quantity>12</Quantity>
<UnitPrice>10.09</UnitPrice>
</OrderItem>
<OrderItem>
<ProductID>56091</ProductID>
<Quantity>2</Quantity>
<UnitPrice>87.95</UnitPrice>
</OrderItem>
</OrderDetails>
</Order>
In your schema, you specify the targetNamespace attribute on the <xsd:schema> element.
<schema targetNamespace="http://schemas.devxpert.com/order"
xmlns:dx="http://schemas.devxpert.com/order" xmlns="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
Besides defining the targetNamespace, we also define the prefix dx, which maps to the same namespace. We’ll use this prefix shortly. We also defined elementFormDefault=”qualified” which means that elements in the Order XML document will be qualified (either by having a namespace prefix or by using a default namespace like the example above).
All types defined within the schema belong to the target namespace and must be referenced using their fully qualified name, which is the namespace prefix followed by a colon followed by the type name. For example, to reference the OrderItemType you’d write dx:OrderItemType because dx is the prefix that’s declared to map to the target namespace. So the full schema using namespaces would be:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://schemas.devxpert.com/order"
xmlns:dx="http://schemas.devxpert.com/order"
elementFormDefault="qualified">
<!-- this is the equivalent of the OrderItem class -->
<xsd:complexType name="OrderItemType">
<xsd:sequence>
<xsd:element name="ProductID"
type="xsd:int"/>
<xsd:element name="Quantity"
type="xsd:short"/>
<xsd:element name="UnitPrice"
type="xsd:double"/>
</xsd:sequence>
</xsd:complexType>
<!-- this corresponds to the Order class -->
<xsd:complexType name="OrderType">
<xsd:sequence>
<xsd:element name="OrderId"
type="xsd:int"/>
<xsd:element name="RequiredDate"
type="xsd:date"/>
<xsd:element name="ShipName"
type="xsd:string"/>
<xsd:element name="OrderDetails"
type="dx:OrderDetailsType"/>
<!-- the following is the equivalent of the OrderDetails
collection -->
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="OrderDetailsType">
<xsd:sequence>
<xsd:element name="OrderItem"
type="dx:OrderItemType"
maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<!-- this corresponds to the Order class -->
<xsd:element name="Order" type="dx:OrderType"/>
</xsd:schema>
In your XML document, you use the attribute schemaLocation to specify which XSD schema is used to validate elements that belong to a given namespace:
<Order xmlns="http://schemas.devxpert.com/order"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://schemas.devxpert.com/order
d:\schemas\order.xsd">
The schemaLocation attribute lets you specify a namespace and the corresponding schema. Its like saying “All elements that belong to this namespace must be validated using that schema”. If your document happens to contain elements from different namespaces (as is the case with WSDL documents) you can specify a different schema for each namespace by listing them all in the schemaLocation attribute. This is very powerful because it lets you mix elements from different schemas in the same document while validating each element with the correct schema.
You might have noticed the xsi namespace prefix on the schemaLocation attribute. XSD defines a few attributes that can be used in the XML document itself as opposed to the XSD schema document. These attributes belong to the XML schema instance namespace, which is http://www.w3.org/2001/XMLSchema-instance. By convention, the prefix used for this namespace is usually xsi.
Comments