XML Schema

Sang Shin, www.javapassion.com/webservices



Understanding XML schema is important given that the messages that are being exchanged between Web service client and service provider are in the form of XML messages.


Expected duration: 60 minutes (excluding homework)



Software Needed

Before you begin, you need to install the required software on your computer as described here.  


Change Log


Things to be done (by Sang Shin)



Lab Exercises

  1. Install SOA modules to NetBeans (only if you are using NetBeans 6.7.x) - skip this step  if you installed GlassFish ESB
  2. Creating a very simple XML Schema
  3. Study sample XML schemas
  4. Homework Exercise (for people who are taking Sang Shin's "Web Services Programming online course")

Exercise 0: Install SOA plug-in's to NetBeans IDE 6.7 or 6.7.1 (Skip if you installed GlassFish ESB)


If you are using NetBeans 6.7 or 6.7.1, you will have to install SOA and XML and WSDL plug-in's yourself as shown below.  If you have installed GlassFish ESB 2.2, skip this step.













Exercise 1: Create a very simple XML Schema

In this exercise, you are going to create a very simple "helloworld" XML schema using NetBeans XML schema designer.  You can create any project type but here you are going to create BPEL module project type which hosts the XML schema file.  Since we have not covered BPEL module, don't worry if you don't understand what BPEL is.
  1. Create a "BPEL Module" NetBeans project (You can create different NetBeans project type)
  2. Create XML Schema

(1.1) Create a "BPEL Module" NetBeans project

0. Start NetBeans IDE. 
1. Create SynchronousSample SOA project.



Figure-1.11: Create BPEL Module

Figure-1.12: Name and Location
                                                                                                             return to top of the exercise


(1.2)  Create XML Schema


1. Create SynchronousSample.xsd.

Figure-1.21: Select Other

Figure-1.22: Create XML Schema

Figure-1.23: Name and Location

2. Add a Complex Type to the XML schema.

Figure-1.24: Display Palette (if it has not been displayed)

Figure-1.25: Add a Complex Type to the schema

3. Add a local element to simpleProcess complex type

Figure-1.26: Add a local element to the complex type

Figure-1.27: Display Properties window

Figure-1.28: Select a definition of the element

Figure-1.29: Expand Built-in Types

Figure-1.30: Select string



Figure-1.31: paramA has string as a definition

Figure-1.32:Display  XML schema

4. Add a global element to the schema.

Figure-1.33: Add a global element

Figure-1.34: typeA global element



Figure-1.35: Select simpleProcess as a definition

Figure-1.36: typeA global element is type of simpleProcess complex type

5. Save all the changes.

Figure-1.37: Save all the changes

6. Display and study the XML schema file.

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://xml.netbeans.org/schema/SynchronousSample"
            xmlns:tns="http://xml.netbeans.org/schema/SynchronousSample"
            elementFormDefault="qualified">
    <xsd:complexType name="simpleProcess">
        <xsd:sequence>
            <xsd:element name="paramA" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:element name="typeA" type="tns:simpleProcess"/>
</xsd:schema>
Code-1.38: XML schema file



                                                                                                             return to top of the exercise



Exercise 2: Study sample XML Schema's


In this exercise, you are going to take a look at a couple of sample XML schemas.
  1. Study a sample XML schema - PurchaseOrder.xsd
  2. Study another sample schema - LoanApplication.xsd

(2.1)  Study sample XML schema - PurchaseOrder.xsd


1. Open DummyJavaApp NetBeans project. 




2. Display and study PurchaseOrder.xsd schema in Source mode.



<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://xml.netbeans.org/examples/PurchaseOrder"
    xmlns:tns="http://xml.netbeans.org/examples/PurchaseOrder"
    elementFormDefault="qualified">
   
    <xsd:annotation>
        <xsd:documentation xml:lang="en">
            Purchase order schema for Example.com.
            Copyright 2000 Example.com. All rights reserved.
        </xsd:documentation>
    </xsd:annotation>
   
    <xsd:element name="purchaseOrder" type="tns:PurchaseOrderType"/>
   
    <xsd:element name="comment" type="xsd:string"/>
   
    <xsd:complexType name="PurchaseOrderType">
        <xsd:sequence>
            <xsd:element name="shipTo" type="tns:USAddress"/>
            <xsd:element name="billTo" type="tns:USAddress"/>
            <xsd:element ref="tns:comment" minOccurs="0"/>
            <xsd:element name="items"  type="tns:Items"/>
        </xsd:sequence>
        <xsd:attribute name="orderDate" type="xsd:date"/>
    </xsd:complexType>
   
    <xsd:complexType name="USAddress">
        <xsd:sequence>
            <xsd:element name="name"   type="xsd:string"/>
            <xsd:element name="street" type="xsd:string"/>
            <xsd:element name="city"   type="xsd:string"/>
            <xsd:element name="state"  type="xsd:string"/>
            <xsd:element name="zip"    type="xsd:decimal"/>
        </xsd:sequence>
        <xsd:attribute name="country" type="xsd:NMTOKEN"
                       fixed="US"/>
    </xsd:complexType>
   
    <xsd:complexType name="Items">
        <xsd:sequence>
            <xsd:element name="item" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="productName" type="xsd:string"/>
                        <xsd:element name="quantity">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:positiveInteger">
                                    <xsd:maxExclusive value="100"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                        <xsd:element name="USPrice"  type="xsd:decimal"/>
                        <xsd:element ref="tns:comment"   minOccurs="0"/>
                        <xsd:element name="shipDate" type="xsd:date" minOccurs="0"/>
                    </xsd:sequence>
                    <xsd:attribute name="partNum" type="tns:SKU" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
   
    <!-- Stock Keeping Unit, a code for identifying products -->
    <xsd:simpleType name="SKU">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\d{3}-[A-Z]{2}"/>
        </xsd:restriction>
    </xsd:simpleType>
   
</xsd:schema>

3. Display it in Design mode.



(2.2)  Study another sample XML schema


1. Display and study LoanApplication.xsd schema.



<?xml version="1.0" encoding="UTF-8"?>

<xs:schema targetNamespace="http://xml.netbeans.org/examples/LoanApplication"
           xmlns="http://xml.netbeans.org/examples/LoanApplication"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified">
   
    <xs:element name="autoLoanApplication">
        <xs:annotation>
            <xs:documentation>A loan application xml schema</xs:documentation>
        </xs:annotation>
        <xs:complexType>
            <xs:sequence>               
                <xs:element name="loan" type="LoanType"/>               
                <xs:element name="term" type="xs:integer"/>               
                <xs:element name="amount">
                    <xs:simpleType>
                        <xs:restriction base="xs:decimal">
                            <xs:minInclusive value="5000.00"/>
                            <xs:maxInclusive value="10000.00"/>
                            <xs:fractionDigits value="2"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="application">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="individual"/>
                            <xs:enumeration value="joint"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>               
                <xs:element name="state" type="StateType"/>               
                <xs:element name="applicant" type="ApplicantType" maxOccurs="2"/>               
                <xs:element name="tradeIn" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="vehicle" type="CarType"/>                           
                            <xs:element name="monthlyPayment">
                                <xs:simpleType>
                                    <xs:restriction base="xs:decimal">
                                        <xs:fractionDigits value="2"/>
                                        <xs:minInclusive value="0.00"/>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
   
    <xs:simpleType name="LoanType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="new"/>
            <xs:enumeration value="used dealer"/>
            <xs:enumeration value="used private"/>
            <xs:enumeration value="refinance"/>
            <xs:enumeration value="lease buyout"/>
        </xs:restriction>
    </xs:simpleType>
   
    <xs:simpleType name="StateType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="AZ"/>
            <xs:enumeration value="CA"/>
            <xs:enumeration value="NY"/>
            <xs:enumeration value="TX"/>
        </xs:restriction>
    </xs:simpleType>
   
    <xs:complexType name="ApplicantType">
        <xs:sequence>
            <xs:element name="name">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="first" type="xs:string"/>
                        <xs:element name="middle" type="xs:string"/>
                        <xs:element name="last" type="xs:string"/>
                        <xs:element name="suffix">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="Jr"/>
                                    <xs:enumeration value="Sr"/>
                                    <xs:enumeration value="II"/>
                                    <xs:enumeration value="III"/>
                                    <xs:enumeration value="IV"/>
                                    <xs:enumeration value="V"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="SSID">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="\d{3}-\d{2}-\d{4}"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="birthDate" type="xs:date"/>
            <xs:element name="homePhone" type="PhoneNumberType"/>
            <xs:element name="cellPhone" type="PhoneNumberType"/>
            <xs:element name="emailAddress">
                <xs:simpleType>
                    <xs:restriction base="xs:string"/>
                </xs:simpleType>
            </xs:element>
            <xs:element name="residence" type="ResidenceType" maxOccurs="unbounded"/>
            <xs:element name="employment">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="status">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="unemployed"/>
                                    <xs:enumeration value="employed"/>
                                    <xs:enumeration value="self employed"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="detail" minOccurs="0">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="occupation" type="xs:string"/>
                                    <xs:element name="employer">
                                        <xs:complexType>
                                            <xs:sequence>
                                                <xs:element name="name"/>
                                                <xs:element name="address" type="AddressType"/>
                                                <xs:element name="lengthOfEmployment" type="DurationType"/>
                                            </xs:sequence>
                                        </xs:complexType>
                                    </xs:element>
                                    <xs:element name="workPhone" type="PhoneNumberType"/>
                                    <xs:element name="grossMonthlyIncome">
                                        <xs:simpleType>
                                            <xs:restriction base="xs:decimal">
                                                <xs:minInclusive value="0.00"/>
                                                <xs:fractionDigits value="2"/>
                                            </xs:restriction>
                                        </xs:simpleType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="supplementalIncome">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="source">
                            <xs:simpleType>
                                <xs:restriction base="xs:string">
                                    <xs:enumeration value="alimony"/>
                                    <xs:enumeration value="child support"/>
                                    <xs:enumeration value="investments"/>
                                    <xs:enumeration value="part time job"/>
                                    <xs:enumeration value="rental property"/>
                                    <xs:enumeration value="retirement income"/>
                                    <xs:enumeration value="social security"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                        <xs:element name="grossMonthlyIncome">
                            <xs:simpleType>
                                <xs:restriction base="xs:decimal">
                                    <xs:minInclusive value="0.00"/>
                                    <xs:fractionDigits value="2"/>
                                </xs:restriction>
                            </xs:simpleType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
   
    <xs:complexType name="AddressType">
        <xs:sequence>
            <xs:element name="address1"/>
            <xs:element name="address2"/>
            <xs:element name="city"/>
            <xs:element name="state" type="StateType"/>
            <xs:element name="zip">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:minLength value="5"/>
                        <xs:maxLength value="5"/>
                        <xs:pattern value="\d{5}"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
   
    <xs:complexType name="PhoneNumberType">
        <xs:sequence>
            <xs:element name="areaCode"/>
            <xs:element name="exchange"/>
            <xs:element name="number"/>
            <xs:element name="extension" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
   
    <xs:complexType name="OccupancyType">
        <xs:sequence>
            <xs:element name="type">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="rent"/>
                        <xs:enumeration value="own"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="movedIn" type="xs:date"/>
            <xs:element name="lengthOfOccupancy" type="DurationType"/>
            <xs:element name="payment">
                <xs:simpleType>
                    <xs:restriction base="xs:decimal">
                        <xs:fractionDigits value="2"/>
                        <xs:minInclusive value="0.00"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
   
    <xs:complexType name="ResidenceType">
        <xs:sequence>
            <xs:element name="address" type="AddressType"/>
            <xs:element name="occupancy" type="OccupancyType"/>
        </xs:sequence>
    </xs:complexType>
   
    <xs:complexType name="CarType">
        <xs:sequence>
            <xs:element name="year" type="xs:gYear"/>
            <xs:element name="make" type="xs:string"/>
            <xs:element name="model" type="xs:string"/>
            <xs:element name="VIN" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
   
    <xs:complexType name="DurationType">
        <xs:sequence>
            <xs:element name="years" type="xs:positiveInteger"/>
            <xs:element name="months">
                <xs:simpleType>
                    <xs:restriction base="xs:positiveInteger">
                        <xs:minInclusive value="1"/>
                        <xs:maxInclusive value="12"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
   
</xs:schema>




Homework Exercise (for people who are taking Sang Shin's "Web Services Programming online course")


1. The homework is to create a XML schema and a XML document that is an instance of the schema as following. The schema needs to be validated.  It is recommended you use NetBeans to create XML schema and document.
2. Send the following files to webserviceshomework@javapassion.com with Subject as WebServices-wsschema.


                                                                                                                    return to the top