|
Некоторые примитивные значения, кроме бетона данного типа могут иметь заранее определенный набор ценностей. И значения могут быть установлены только для одного этого варианта, как и перечислений. 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 {
// ...
}
}
|
|