|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Сложные типыЭлементы, содержащие в себе атрибуты и/или дочерние элементы, называются сложными. Сложные элементы создаются с помощью элемента complexType. Так же как и в простом типе, атрибут name задает имя типа. Для указания, что элементы должны располагаться в определенной последовательности, используется элемент sequence. Он может содержать элементы element, определяющие содержание сложного типа. Если тип может содержать не только элементы, но и текстовую информацию, необходимо задать значение атрибута mixed в true. Кроме элементов, тип может содержать атрибуты, которые создаются элементом Следующий пример демонстрирует описание типа 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. Тогда в результате запуска в файл будут выведены следующие сообщения обработчика об ошибках: Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.013 сек.) |