Некоторые примитивные значения, кроме бетона данного типа могут иметь заранее определенный набор ценностей. И значения могут быть установлены только для одного этого варианта, как и перечислений. XML-схема позволяет ограничить стоимость данного типа набора перечисленными ценностями. С другой стороны, мы можем ограничить некоторое значение, определяя свои мин / макс пределах:


<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">



  <xs:element name="purchase-order">

  ...

////////////// order number should be an integer in range (0;1000):

    <xs:attribute name="number" use="required">

    <xs:simpleType>

      <xs:restriction base="xs:integer">

        <xs:maxExclusive value="1000"/>

        <xs:minExclusive value="0"/>

      </xs:restriction>

    </xs:simpleType>

    </xs:attribute>



              <xs:element name="item" maxOccurs="unbounded">

    ...

//////////////  our item-type may be either CD or DVD:



                  <xs:attribute name="type">

                    <xs:simpleType>

                      <xs:restriction base="xs:string">

                        <xs:enumeration value="CD"/>

                        <xs:enumeration value="DVD"/>

                      </xs:restriction>

                    </xs:simpleType>

                  </xs:attribute>

    ...

                </xs:complexType>

    ...

              </xs:element>

  ...

  </xs:element>

</xs:schema>

Атрибутов в схеме определяется как дочерние элементы. Для того чтобы иметь атрибуты элемента сложного типа. Единственным отличием является то, что атрибуты не входит в последовательность выбора сферы; скорее, они находятся в ComplexType-секции сразу. Элемент может содержать любое количество атрибутов-определений:


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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="purchase-order">

    <xs:complexType>

    ...

    <xs:element name="item" maxOccurs="unbounded">

    <xs:complexType>

////////////// attributes must be locates in complexType definition:



      <xs:attribute name="code" type="xs:integer"/>



      <xs:attribute name="type">

        <xs:simpleType>

          <xs:restriction base="xs:string">

            <xs:enumeration value="CD"/>

            <xs:enumeration value="DVD"/>

          </xs:restriction>

        </xs:simpleType>

      </xs:attribute>



      <xs:attribute name="label" type="xs:string"/>

    </xs:complexType>

    </xs:element>

    ...

  </xs:element>

</xs:schema>

XML Schema privides механизма для ограничения значений элементов и атрибутов для конкретных типов данных, как целое и дату. Данная информация будет использована валидатор-инструментом для проверки действительности документа, а также разбор значение окончательного laguage основе типов. XML Schema contsaines огромный набор предустановленных простых типов данных. В нашей выборке схеме мы будем использовать их для определения некоторых параметров:


  <xs:element name="purchase-order">



////////////// define date attribute of type date:

    <xs:attribute name="date" type="xs:date" use="required"/>



////////////// order number should be an integer:

    <xs:attribute name="number" type="xs:integer" use="required"/>



////////////// both attributes are marked as 'required', thus absence of each 

////////////// one of them will lead a validation error;

  ...

////////////// element can also have a primitive value:

              <xs:element name="address" type="xs:string"/>

  ...

  </xs:element>

</xs:schema>

В дополнение к примитивов, XML Schema, конечно, позволяет определять сложные типы, как структуры. Есть два вида сложных типов: последовательность и возможность выбора. Хотя последовательность представляет собой набор элементов, присутствующих ребенка в то же время, выбор может содержать только одну из них. Мы используем в нашем определении последовательности типа для определения содержания заказа на покупку:


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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">



  <xs:element name="purchase-order">



////////////// our purchase-order is a complex of type sequence:

    <xs:complexType>

      <xs:sequence>



////////////// order originator  is alseo described as sequence of one element:

        <xs:element name="purchased-by">

          <xs:complexType>

            <xs:sequence>

              <xs:element name="address" type="xs:string"/>

            </xs:sequence>

    ...

          </xs:complexType>

        </xs:element>





////////////// the items represents a collection:

        <xs:element name="order-items">

          <xs:complexType>

            <xs:sequence>



              <xs:element name="item" maxOccurs="unbounded">

                <xs:complexType>

    ...

                  <xs:attribute name="code" type="xs:integer"/>

    ...

                </xs:complexType>



              </xs:element>



            </xs:sequence>

          </xs:complexType>

        </xs:element>



  ...

    </xs:complexType>

  </xs:element>

</xs:schema>

В целях проверки данных XML в действительности мы должны подготовить свои схеме XSD-файл. Этот файл будет загружен пакет JAXP к экземпляру объектов схемы. Тогда мы будем использовать схему с целью выпуска Validator который затем может быть использована для проверки любого документа, типу, указанному в outr схеме.


import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;

import javax.xml.validation.SchemaFactory;

import javax.xml.validation.Validator;



import org.xml.sax.SAXException;



/**

 * A sample application which shows how to perform a

 * XML document validation.

 */



public class Test {

  public static void main(String[] args) {

    try {

      // define the type of schema - we use W3C:

      String schemaLang = "http://www.w3.org/2001/XMLSchema";



      // get validation driver:

      SchemaFactory factory = SchemaFactory.newInstance(schemaLang);



      // create schema by reading it from an XSD file:

      Schema schema = factory.newSchema(new StreamSource("sample.xsd"));

      Validator validator = schema.newValidator();



      // at last perform validation:

      validator.validate(new StreamSource("sample.xml"));



    }catch (SAXException ex) {

      // we are here if the document is not valid:

      // ... process validation error...

    catch (Exception ex) {

      ex.printStackTrace();

    }

  }

}

Если наша схема предполагает использование одного и того же элемента в нескольких местах, мы должны объявить его несколько раз. Во избежание этого мы можем определить такие общие элементом в конце схемы сферу один раз. После этого, когда это необходимо, чтобы вставить этот элемент декларации мы используем Ref атрибутов, а не имя, например, следующим образом:


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

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="purchase-order">

  <xs:complexType>

    <xs:sequence>

      ...

      <xs:element name="order-items">

      <xs:complexType>

          <xs:sequence>



////////////// here we refer an element declared somewhere late:



            <xs:element ref="item" maxOccurs="unbounded"/>

          </xs:sequence>

        </xs:complexType>

      </xs:element>

      ...

    </xs:sequence>

    ...

  </xs:complexType>

  </xs:element>



////////////// we declare all shared elements outside the root one:



  <xs:element name="item">

  <xs:complexType>

    ...

  </xs:complexType>

  </xs:element>

</xs:schema>

XML Schema некоторым другим XML-файла, который, как DTD определяет тип содержимого документа. Ths наиболее известной является W3C XML Schema, но не может иным способом заявить о документе. Примера ниже показан общий схем XML содержание. Ее корневой элемент схемы. Кроме имен-префиксом отображения может содержать некоторый набор атрибутов. Здесь мы даем возможность полного названия элементов и имена (без имен prfixes) для атрибутов:


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



////////////// schema declaration, customization:



<xs:schema

  xmlns:xs="http://www.w3.org/2001/XMLSchema"

  elementFormDefault="qualified"

  attributeFormDefault="unqualified">



////////////// declaration of our root element:



  <xs:element name="purchase-order">

  ...

  </xs:element>

</xs:schema>

Одним из основных преимуществ является то, что проверку можно комбинировать его с стандартных парсеров, как SAX. В этом случае при обращении SAX случае мы не безразлично документ действителен или нет. Validator будет проверить это для нас. И мы будем получать SAX событий из уже проверены XML содержание. Приведенном ниже показано, как вставить JAXP проверка между исходным XML-файла и SAX-анализатор:


import javax.xml.transform.sax.SAXResult;

import javax.xml.transform.sax.SAXSource;

import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.Schema;

import javax.xml.validation.SchemaFactory;

import javax.xml.validation.Validator;



import org.xml.sax.InputSource;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;



/**

 * A sample application which shows how to perform a

 * XML document validation while parsing XML with SAX.

 */



public class Test {

  public static void main(String[] args) {

    try {

      // create schema by from an XSD file:

      String schemaLang = "http://www.w3.org/2001/XMLSchema";

      SchemaFactory jaxp = SchemaFactory.newInstance(schemaLang);

      Schema schema = jaxp.newSchema(new StreamSource("sample.xsd"));

      // prepare document validator:

      Validator validator = schema.newValidator();



      // prepare SAX handler and SAX result receiving validate data:

      SaxHandler handler = new SaxHandler();

      SAXResult sax = new SAXResult(handler);



      // at last send valid data to out SAX handler:

      SAXSource source = new SAXSource(new InputSource("sample.xml"));

      validator.validate(source, sax);



    }catch (SAXException ex) {

      // we are here if the document is not valid:

      // ... process validation error...

      ex.printStackTrace();

    catch (Exception ex) {

      ex.printStackTrace();

    }

  }



  // our SAX handler receiving validated data:

  private static final class SaxHandler extends DefaultHandler {

    // ...

  }

}