АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Сложные типы

Читайте также:
  1. Вещи манципируемые и неманципируемые, простые и сложные в римском праве.
  2. ДВУХСЛОЖНЫЕ СЛОВА ИЗ ЗАКРЫТЫХ СЛОГОВ
  3. ДВУХСЛОЖНЫЕ СЛОВА ИЗ ОТКРЫТЫХ СЛОГОВ
  4. ДВУХСЛОЖНЫЕ СЛОВА ИЗ ОТКРЫТЫХ СЛОГОВ.
  5. ДВУХСЛОЖНЫЕ СЛОВА СО СТЕЧЕНИЕМ СОГЛАСНЫХ В НАЧАЛЕ СЛОВА И ОТКРЫТЫМ СЛОГОМ
  6. ДВУХСЛОЖНЫЕ СЛОВА СО СТЕЧЕНИЕМ СОГЛАСНЫХ В СЕРЕДИНЕ СЛОВА И ОТКРЫТЫМ СЛОГОМ
  7. Лекция 2. Сложные проценты
  8. Методика «Сложные аналогии»
  9. Наращение процентов, налоги и инфляция (простые и сложные проценты)
  10. Образуйте сложные предложения. Употребите союзы, данные в скобках.
  11. ОБЪЕКТ И СУБЪЕКТ УПРАВЛЕНИЯ. СЛОЖНЫЕ СИСТЕМЫ
  12. Простые и сложные вещества

Элементы, содержащие в себе атрибуты и/или дочерние элементы, называются сложными.

Сложные элементы создаются с помощью элемента complexType. Так же как и в простом типе, атрибут name задает имя типа. Для указания, что элементы должны располагаться в определенной последовательности, используется элемент sequence. Он может содержать элементы element, определяющие содержание сложного типа. Если тип может содержать не только элементы, но и текстовую информацию, необходимо задать значение атрибута mixed в true. Кроме элементов, тип может содержать атрибуты, которые создаются элементом
attribute. Атрибуты элемента attribute: name – имя атрибута, type – тип значения атрибута. Для указания, обязан ли использоваться атрибут, нужно использовать атрибут use, который принимает значения required, optional, prohibited. Для установки значения по умолчанию используется атрибут default, а для фиксированного значения – атрибут fixed.

Следующий пример демонстрирует описание типа Student:

<complexType name="Student">

<sequence>

<element name="name" type="string"/>

<element name="telephone" type="decimal"/>

<element name="address" type="tns:Address"/>

</sequence>

<attribute name="login" type="tns:Login"

use="required"/>

<attribute name="faculty" type="string"

use="required"/>

</complexType>

Для объявления атрибутов в элементах, которые могут содержать только текст, используются элемент simpleContent и элемент extension, с помощью которого расширяется базовый тип элемента атрибутом(ами).

<element name="Student">

<complexType>

<simpleContent>

<extension base="string">

<attribute name="birthday" type="string"/>

</extension>

</simpleContent>

</complexType>

</element>

Для расширения/ограничения ранее объявленных сложных типов используется элемент complexContent.

<complexType name=”personType”>

<sequence>

<element name=”firstName” type=”string”/>

<element name=”lastName” type=”string”/>

<element name=”address” type=”string”/>

</sequence>

</complexType>

<complexType name=”studentType”>

<complexContent>

<extension base=”personType”>

<sequence>

<element name=”course” type=”integer”/>

<element name=”faculty” type=”string”/>

</sequence>

</extesion>

</complexContent>

</complexType>

<element name=”Student” type=”studentType”/>

Для задания порядка следования элементов в XML используются такие теги, как <all>, который допускает любой порядок.

<element name=”person”>

<complexType>

<all>

<element name=”firstName” type=”string”/>

<element name=”lastName” type=”string”/>

</all>

</complexType>

</element>

Элемент <choice> указывает, что в XML может присутствовать только один из перечисленных элементов. Элемент <sequence> задает строгий порядок дочерних элементов.

Для списка студентов XML-схема students.xsd может выглядеть следующим образом:

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

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

targetNamespace="http://www.example.com/Students"

xmlns:tns="http://www.example.com/Students">

<element name="students">

<complexType>

<sequence>

<element name="student" type="tns:Student" minOccurs="1" maxOccurs="unbounded" />

</sequence>

</complexType>

</element>

<complexType name="Student">

<sequence>

<element name="name" type="string" />

<element name="telephone" type="decimal" />

<element name="address" type="tns:Address" />

</sequence>

<attribute name="login" type="tns:Login" use="required" />

<attribute name="faculty" type="string" use="required" />

</complexType>

<simpleType name="Login">

<restriction base="ID">

<pattern value="[a-zA-Z]{3}[a-zA-Z0-9_]*"/>

</restriction>

</simpleType>

<complexType name="Address">

<sequence>

<element name="country" type="string" />

<element name="city" type="string" />

<element name="street" type="string" />

</sequence>

</complexType>

</schema>

В приведенном примере используется понятие пространства имен namespace. Пространство имен введено для разделения наборов элементов с соответствующими правилами, описанными схемой. Пространство имен объявляется с помощью атрибута xmlns и префикса, который используется для элементов из данного пространства.

Например, xmlns="http://www.w3.org/2001/XMLSchema" задает про­странство имен по умолчанию для элементов, атрибутов и типов схемы, которые принадлежат пространству имен "http://www.w3.org/2001/XMLSchema" и описаны соответствующей схемой.

Атрибут targetNamespace="http://www.example.com/Students" задает пространство имен для элементов/атрибутов, которые описывает данная схема.

Атрибут xmlns:tns="http://www.example.com/Students" вводит префикс для пространства имен (элементов) данной схемы. То есть для всех элементов, типов, описанных данной схемой и используемых здесь же требуется использовать префикс tns, как в случае с типами – tns:Address, tns:Login и т.д.

Действие пространства имён распространяется на элемент, где он объявлен, и на все дочерние элементы.

Тогда для проверки документа объекту-парсеру следует дать указание использовать DTD или схему XSD, и в XML-документ вместо ссылки на DTD добавить вместо корневого элемента <students> элемент <tns:students> вида:

<tns:students xmlns:tns="http://www.example.com/Students"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.example.com/Students students.xsd ">

Следующий пример выполняет проверку документа на корректность средствами языка Java.

/* пример # 13: проверка корректности документа XML: XSDMain.java */

package chapt16.xsd;

import java.io.IOException;

import org.xml.sax.SAXException;

import org.apache.xerces.parsers.DOMParser;

import org.xml.sax.SAXNotRecognizedException;

import org.xml.sax.SAXNotSupportedException;

import chapt16.xsd.MyErrorHandler;

 

public class XSDMain {

public static void main(String[] args) {

 

String filename = "students.xml";

DOMParser parser = new DOMParser();

try {

// установка обработчика ошибок

parser.setErrorHandler(new MyErrorHandler("log.txt"));

 

// установка способов проверки с использованием XSD

parser.setFeature(

"http://xml.org/sax/features/validation", true);

parser.setFeature(

"http://apache.org/xml/features/validation/schema", true);

 

parser.parse(filename);

} catch (SAXNotRecognizedException e) {

e.printStackTrace();

System. out. print("идентификатор не распознан");

} catch (SAXNotSupportedException e) {

e.printStackTrace();

System. out. print("неподдерживаемая операция");

 

} catch (SAXException e) {

e.printStackTrace();

System. out. print("глобальная SAX ошибка ");

} catch (IOException e) {

e.printStackTrace();

System. out. print("ошибка I/O потока");

 

}

System. out. print("проверка " + filename + " завершена");

}

}

Класс обработчика ошибок может выглядеть следующим образом:

/* пример # 14: обработчик ошибок: MyErrorHandler.java */

package chapt16.xsd;

import java.io.IOException;

import org.xml.sax.ErrorHandler;

import org.xml.sax.SAXParseException;

import org.apache.log4j.FileAppender;

import org.apache.log4j.Logger;

import org.apache.log4j.SimpleLayout;

 

public class MyErrorHandler implements ErrorHandler {

private Logger logger;

 

public MyErrorHandler(String log) throws IOException {

//создание регистратора ошибок chapt16.xsd

logger = Logger.getLogger("chapt16.xsd");

//установка файла и формата вывода ошибок

logger.addAppender(new FileAppender(

new SimpleLayout(), log));

}

public void warning(SAXParseException e) {

logger.warn(getLineAddress(e) + "-" +

e.getMessage());

}

public void error(SAXParseException e) {

logger.error(getLineAddress(e) + " - "

+ e.getMessage());

}

public void fatalError(SAXParseException e) {

logger.fatal(getLineAddress(e) + " - "

+ e.getMessage());

}

private String getLineAddress(SAXParseException e) {

//определение строки и столбца ошибки

return e.getLineNumber() + ": "

+ e.getColumnNumber();

}

}

Чтобы убедиться в работоспособности кода, следует внести в исходный XML-документ ошибку. Например, сделать идентичными значения атрибута login. Тогда в результате запуска в файл будут выведены следующие сообщения обработчика об ошибках:


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.015 сек.)