Средства разработки web-страниц

 

Федеральное агентство по образованию

Государственное образовательное учреждение

среднего профессионального образования

Хакасский политехнический колледж












Внеаудиторная работа

по дисциплине: «Распределённые системы обработки информации»




Выполнил: студент гр. АИС-41

Урванцев А.В.








Абакан, 2009

Понятие Java-апплета. Средства создания Java-апплетов


Апплет объединяет в себе элементы сложного графического окна с легкостью использования и возможностями работы с сетями. В сущности, он является миниатюрным графическим интерфейсом пользователя, подобно Microsoft Windows или X11, который, как гарантируют разработчики, будет иметь в основном одни и те же функциональные возможности независимо от типа компьютера, им управляющего.

Апплеты очень полезны для написания прикладных программ для Интернет, потому что они могут быть вложены в HTML-документы и выполняться в броузерах Web, допускающих использование языка Java, - например, Netscape Navigator 2.0. Чтобы создать свои собственные апплеты, нужно расширить класс Applet и сослаться на новый класс на Web-странице. Давайте рассмотрим апплет "Hello World", подобный апплету, "Основы программирования на Java".

Пример. Апплет "Hello World".

java.applet.*;java.awt.*;class HelloWorldApplet extends Applet {void init() {(250,250);

}void paint(Graphics g) {.drawString("Hello world!",25,25);

}

}


Апплет "Hello World" расширяет класс Applet, а это означает, что все методы и переменные, доступные классу Applet, доступны и нашему расширению этого класса. К примеру, взяв два из этих методов - init и paint, - мы можем изменить их заданное по умолчанию поведение так, чтобы они делали то, что нам нужно. Рассмотрим HTML-код для Web-страницы, которая содержит апплет "Hello World".

Пример. Web-страница "Hello World".


<HTML>

<HEAD>

<TITLE>Hello World Applet</TITLE>

</HEAD>

<BODY>

<APPLET CODE="HelloWorldApplet.class"=250 HEIGHT=250>

</APPLET>

</BODY>

</HTML>


Стадии выполнения апплета

Когда Java-совместимый броузер Web загружает класс Applet, сначала он распределяет память для апплета и глобальных переменных. Затем выполняется метод init. (Вообще, программисты используют метод init, чтобы инициализировать глобальные переменные, получить ресурсы из сети и установить интерфейс пользователя.) После этого броузер вызывает метод start. Если часть броузера, содержащего апплет, видима (что обычно и случается, когда апплет только начинает свою работу), вызывается метод paint. Если пользователь уходит со страницы, содержащей апплет, броузер вызывает метод stop. Когда пользователь возвращается на страницу с апплетом, метод start, так же как и метод paint, вызывается снова. Следующий фрагмент кода иллюстрирует работу апплета в случае, если пользователь покидает страницу и затем возвращается на нее.

Пример. Апплет, считающий обращения к странице.


import java.applet.*;java.awt.*;

public class Count extends Applet {InitCount=0;StartCount=0;StopCount=0;PaintCount=0;void init() {(250,75);= InitCount + 1;}void start() {= StartCount + 1;}void stop() {= StopCount + 1;}void paint(Graphics g) {++;Output = new String(

"Inits: "+InitCount+

" Starts: "+StartCount+

" Stops: "+StopCount+

" Paints: "+PaintCount);.drawString(Output,25,25); } }


Одна из причин популярности World Wide Web - легкость, с которой авторы могут добавлять к своим Web-страницам изображения и звук, просто включая в код страницы указатели на местоположение графических и звуковых файлов, которые они хотят использовать. Использование языка Java дает еще более простой и намного более мощный способ. HTML - язык описания документа; Java - добротный язык программирования. Ваши Java-апплеты могли бы использовать изображения как графические пиктограммы или спрайты в игре аркадного стиля. Следующий Java-апплет принимает из сети файл с изображением и звуком и отображает их.

Пример. Апплет для Web.

java.applet.*;

import java.awt.*;java.net.*;

public class WebApplet extends Applet {Image myImage;AudioClip mySound;URL ImageURL;URL SoundURL;void init() {(250,250);{

// привязываем URL к ресурсам= new ("#"justify">// следим за правильностью URL

catch (MalformedURLException e) {}

// загружаем изображение

myImage = getImage(ImageURL);

// загружаем звук

mySound = getAudioClip(SoundURL);}

public void start() {

// запускаем проигрывание звука

mySound.loop();}void stop() {

// останавливаем проигрывание звука.stop();}

public void paint(Graphics g) {

// выводим изображение.drawImage(myImage,0,0,this);

}

}


Использование ActiveX объектов на web-страницах


Технология ActiveX базируется на технологии Microsoft COM (Component Object Model - модель компонентных объектов), позволяющей создавать и использовать программные компоненты, предоставляющие различные сервисы другим приложениям, компонентам и операционной системе. COM представляет собой одну из реализаций концепции распределенных вычислений, базирующейся в общем случае на предоставлении возможности приложениям использовать для расширения своей функциональности готовые компоненты и объекты (иногда они называются сервисами). Технология COM позволяет использовать объектно-ориентированный подход не в рамках одного приложения, а в рамках операционной системы, но, в отличие от стандартных классов, определенных в исходном тексте и реализуемых как объекты в адресном пространстве одного процесса, эти компоненты могут в общем случае располагаться в адресных пространствах разных процессов и даже на разных компьютерах.

В настоящее время существуют три типа спецификаций COM, определенных Microsoft и включающих большое количество интерфейсов и функций:

·OLE-документы - составные документы, содержащие внедренные или связанные объекты. Эта спецификация описывает правила создания контейнеров для таких документов с "активацией по месту". Отметим, что компонент OLEContainer Delphi и C++Builder создан с учетом этой спецификации (этой теме будет посвящена одна из следующих статей данного цикла).

·OLE Automation. Эта спецификация описывает, как создать сервер и контроллер, управляющий его поведением с помощью скриптов или макросов. Эта спецификация также поддерживается Delphi и C++Builder (об этом также пойдет речь в ближайших статьях данного цикла).

·Управляющие элементы ActiveX, использующие специальный вариант протокола Automation (о них-то и пойдет речь в данной статье).

Использование COM, и, в частности, технологии ActiveX, позволяет обеспечить создание приложений, собираемых из готовых компонентов - элементов управления ActiveX, отличающееся от привычной пользователям C++Builder или Delphi разработки приложений с помощью VCL-компонентов тем, что такая "сборка" не зависит от того, на каком языке написаны как готовые компоненты, так и использующее их приложение - лишь бы средство разработки поддерживало возможность использования таких компонентов в разрабатываемом приложении (такое приложение обычно называется контейнером).

Элементы управления ActiveX представляют собой библиотеки, содержащие исполняемый код. Как было сказано выше, эти библиотеки могут быть использованы в различных приложениях как встроенные элементы управления, поэтому они обладают свойствами, событиями и методами, доступными посредством автоматизации. Современные средства разработки, как правило, позволяют включать такие элементы в создаваемые с их помощью приложения. Помимо этого, элементы управления ActiveX нередко используются в качестве расширений web-броузеров с целью придания им дополнительной функциональности, например, для отображения документов, отличных от поддерживаемых данным броузером.

Как любой COM-сервер, элемент управления ActiveX обладает уникальным идентификатором GUID и должен быть зарегистрирован в реестре. На основании этой записи может быть осуществлен поиск местоположения файла с расширением *.ocx, содержащего его реализацию.

Таким образом, создав элемент управления ActiveX, обладающий интересующей Вас функциональностью, Вы можете в дальнейшем позволить его пользователям встраивать этот элемент в свои приложения (например, написанные на Visual Basic, PowerBuilder, Delphi, C++Builder и др.), отображать его в web-броузере в составе выгруженной с Вашего web-сервера HTML-страницы, включать его в состав документов MS Office, при этом Вы не обязаны предоставлять исходный текст этого компонента.

Спецификация ActiveX представляет собой набор правил (а именно описание стандартных интерфейсов), с помощью которых следует создавать такие элементы управления. Отметим, что текущая версия этой спецификации учитывает возможность использования в качестве контейнера web-броузеров и необходимость загрузки элементов ActiveX с удаленных web-серверов с их автоматической регистрацией.

Пример использования ActiveX:


web страница редактор документ


Краткий обзор WYSIWYG средств разработки web-страниц


Редакторы типа WYSIWYG характеризуются тем, что позволяют пользователю создавать оформление страницы, после чего программа автоматически пишет код к этой странице, вот несколько примеров подобных программ.

Microsoft FrontPage

Microsoft FrontPage, входящий в пакет Microsoft Office, является классическим WYSIWYG-редактором, в котором, однако, присутствует возможность ручной правки кода.

Интерфейс программы во многом напоминает таковой и Microsoft Word, что нисколько не удивляет - унификация внешнего вида поможет новичкам быстрее освоить основные возможности FrontPage.

В программе имеется три режима работы с документом: Normal, HTML и Preview. В режиме Normal веб-страница представляет собой обычный текстовый файл с возможностью редактирования всех элементов - от текста до картинок.



Macromedia Dreamweaver MX 2004

Macromedia Dreamweaver MX 2004 позволяет ожидать многого от этой HTML-редактора. И действительно, возможности Macromedia Dreamweaver MX 2004 впечатляют. После установки пользователя просят выбрать внешний вид программы, который отличается в зависимости от подхода к созданию веб-документов. При выборе "Code" интерфейс программы будет подстроен под нужды кодировщика, а при выборе "Design" - соответственно, дизайнера. Впрочем, всегда имеется возможность для переключения между этими двумя режимами, а также доступен третий, комбинированный режим - рабочая область программы делится на две части.


HomeSite

Macromedia HomeSite, пожалуй, является одним из самых распространенных средств редактирования HTML-документов среди пользователей, предпочитающих кодировать страницы вручную. Вместе с тем, HomeSite позволяет значительно ускорить сам процесс создания и облегчить работу разработчика.



Технология COM. Возможности технологии

(англ. Component Object Model - Объектная Модель Компонентов; произносится как [ком]) - это технологический стандарт от компании Microsoft, предназначенный для создания программного обеспечения на основе взаимодействующих распределённых компонентов, каждый из которых может использоваться во многих программах одновременно. Технология воплощает в себе идеи полиморфизма и инкапсуляции объектно-ориентированного программирования. Технология COM в принципе является универсальной и платформо-независимой, но закрепилась в основном на операционных системах семейства Windows. В современных версиях Windows COM используется очень широко. На основе COM также было создано множество других стандартов: OLE Automation, ActiveX, DCOM, COM+.

Основным понятием, которым оперирует технология COM, является COM-компонент. Программы, построенные на технологии COM, фактически не являются автономными программами, а представляют собой набор взаимодействующих между собой COM-компонентов. Каждый компонент имеет уникальный идентификатор (GUID) и может одновременно использоваться многими программами. Компонент взаимодействует с другими программами через COM-интерфейсы - наборы абстрактных функций и свойств. Каждый COM-компонент должен, как минимум, поддерживать стандартный интерфейс «IUnknown», который предоставляет базовые средства для работы с компонентом.

Windows API предоставляет базовые функции, позволяющие использовать COM-компоненты. Библиотеки MFC и, особенно, ATL/WTL предоставляют гораздо более гибкие и удобные средства для работы с COM. Библиотека ATL от Майкрософт до сих пор остаётся самым популярным средством создания COM-компонентов. Но, зачастую, COM-разработка остаётся ещё довольно сложным делом, программистам приходится вручную выполнять многие рутинные задачи, связанные с COM (особенно это заметно в случае разработки на C++). Впоследствии (в технологиях COM+ и особенно.NET) Майкрософт попыталась упростить задачу разработки COM-компонентов.

В составе Windows 2000 была выпущена технология COM+, которая расширяла возможности разработчиков COM-компонентов, предоставляя им некоторые готовые услуги, например:

улучшенную поддержку потоков;

доступ к контексту, в котором выполняется компонент (например, компоненты, используемые в ASP, могут с этой возможностью получить доступ к внутренним объектам той страницы, на которой они выполняются).

COM+ объединяет компоненты в так называемые приложения COM+, что упрощает администрирование и обслуживание компонентов. Безопасность и производительность - основные направления усовершенствований COM+. Некоторые идеи, заложенные в основу COM+, были также реализованы в Microsoft.NET.

В 2002 году была официально выпущена платформа Microsoft.NET, которая на сегодняшний день объявлена Майкрософт рекомендуемой основой для создания приложений и компонентов под Windows. По этой причине в.NET включены и средства, позволяющие обращаться к компонентам COM из приложений.NET, и наоборот. По словам представителей Майкрософт, COM (точнее, COM+) и.NET являются отлично взаимодополняющими технологиями.


Технология CORBA. Возможности технологии

- наиболее развитая на сегодняшний день объектная технология распределенного программирования (#"justify">Технология CORBA (Common Object Request Broker Architecture), разрабатываемая OMG (Object Managment Group) с 1990-го года, позволяет вызывать методы у объектов, находящихся в сети где угодно, так, как если бы все они были локальными объектами.

На рисунке показана основная структура CORBA 2.0 ORB.



Dynamic Invocation Interface (DII): позволяет клиенту находить сервера и вызывать их методы во время работы системы. IDL Stubs: определяет, каким образом клиент производит вызов сервера. ORB Interface: общие как для клиента, так и для сервера сервисы. IDL Skeleton: обеспечивает статические интерфейсы для объектов определенного типа. Dynamic Skeleton Inerface: общие интерфейсы для объектов, независимо от их типа, которые не были определены в IDL Skeleton. Object Adapter: осуществляет коммуникационное взаимодействие между объектом и ORB.

К основным достоинствам CORBA можно отнести межязыковую и межплатформенную поддержку. Хотя CORBA-сервисы и отнесены к достоинствам технологии CORBA, их в равной степени можно одновременно отнести и к недостаткам CORBA, ввиду практически полного отсутствия их реализации.

Практически, для создания распределенных компонентов при программировании в CORBA выполняются обычно как минимум следующие шаги:

·Проектируются распределенные компоненты;

·Описываются интерфейсы открытых объектов этих компонентов на языке IDL;

·Создаются реализации компонентов (объекты и их клиенты);

·Тестирование компонентов в распределенной среде;

·Распределяются компоненты по нужным точкам в Сети.


Описание возможного содержания XML документа с помощью схем DTD


XML Schema призвана обеспечить богатую грамматическую структуру для XML-документов и преодолеть ограничения, присущие DTD. XML Schema выразительнее DTD. Первые три листинга производят краткое сравнение различных путей представления элементов. Листинг 1 <#"justify">XML-документ<Book> <Title>Cool XML<Title> <Author>Cool Guy</Author> </Book> DTD<!ELEMENT Book (Title, Author)> <!ELEMENT Title (#PCDATA)> <!ELEMENT Author (#PCDATA)> XML Schema<element name='Book' type='BookType'/> <complexType name='BookType'> <element name='Title' type='string'/> <element name='Author' type='string'/> </complexType>

Хотя код XML в Tаблице 1 <#"justify">Например, для элемента <flower> можно определить следующее правило:


<!ELEMENT flower PCDATA>


Ключевое слово ELEMENT указывает, что данной инструкцией будет описываться элемент XML. Внутри этой инструкции задается название элемента(flower) и тип его содержимого.

В определении элемента мы указываем сначала название элемента(flower), а затем его модель содержимого - определяем, какие другие элементы или типы данных могут встречаться внутри него. В данном случае содержимое элемента flower будет определяться при помощи специального маркера PCDATA (что означает parseable character data - любая информация, с которой может работать программа-анализатор). Существует еще две инструкции, определяющие тип содержимого: EMPTY,ANY. Первая указывает на то, что элемент должен быть пустым (например, <red/>), вторая - на то, что содержимое элемента специально не описывается.

Последовательность дочерних для текущего элемента объектов задается в виде списка разделенных запятыми названий элементов. При этом для того, чтобы указать количество повторений включений этих элементов могут использоваться символы +,*, ?:


<!ELEMENT issue (title, author+, table-of-contents?)>


В этом примере указывается, что внутри элемента <issue> должны быть определены элементы title, author и table-of-contents, причем элемент title является обязательным элементом и может встречаться лишь однажды, элемент author может встречаться несколько раз, а элемент table-of-contents является опциональным, т.е. может отсутствовать. В том случае, если существует несколько возможных вариантов содержимого определяемого элемента, их следует разделять при помощи символа "|":

<!ELEMENT flower (PCDATA | title )*>

Символ * в этом примере указывает на то, что определяемая последовательность внутренних элементов может быть повторена несколько раз или же совсем не использоваться.

Если в определении элемента указывается "смешанное" содержимое, т.е. текстовые данные или набор элементов, то необходимо сначала указать PCDATA, а затем разделенный символом "|" список элементов.

Пример корректного XML- документа:


<?xml version="1.0"?>

<! DOCTYPE journal [

<!ELEMENT contacts (address, tel+, email?)>

<!ELEMENT address (street, appt)>

<!ELEMENT street PCDATA>

<!ELEMENT appt (PCDATA | EMPTY)*>

<!ELEMENT tel PCDATA>

<!ELEMENT email PCDATA]>...

<contacts><address>

<street>Marks avenue</street>

<appt id="4">

</address>

<tel>12-12-12</tel>

<tel>46-23-62</tel>

<email>[email protected]</email>

</contacts>


Определение атрибутов с помощью схем DTD


В XML- документах DTD определяет набор действительных элементов, идентифицирует элементы, которые могут находиться в других элементах, и определяет действительные атрибуты для каждого из них. Синтаксис DTD весьма своеобразен и от автора-разработчика требуются дополнительные усилия при создании таких документов(сложность DTD является одной из причин того, что использование SGML, требующего определение DTD для любого документа, не получило столь широкого распространения как, например, HTML). Как уже отмечалось, в XML использовать DTD не обязательно - документы, созданные без этих правил, будут правильно обрабатываться программой-анализатором, если они удовлетворяют основным требованиям синтаксиса XML. Однако контроль за типами элементов и корректностью отношений между ними в этом случае будет полностью возлагаться на автора документа. До тех пор, пока грамматика нашего нового языка не описана, его сможем использовать только мы, и для этого мы будем вынуждены применять специально разработанное программное обеспечение, а не универсальные программы-анализаторы.

В DTD для XML используются следующие типы правил: правила для элементов и их атрибутов, описания категорий(макроопределений), описание форматов бинарных данных. Все они описывают основные конструкции языка - элементы, атрибуты, символьные константы внешние файлы бинарных данных.

Для того, чтобы использовать DTD в нашем документе, мы можем или описать его во внешнем файле и при описании DTD просто указать ссылку на этот файл или же непосредственно внутри самого документа выделить область, в которой определить нужные правила. В первом случае в документе указывается имя файла, содержащего DTD- описания:


<?xml version="1.0" standalone="yes" ?>

<! DOCTYPE journal SYSTEM "journal.dtd">...Внутри же документа DTD- декларации включаются следующим образом:...<! DOCTYPE journal [

<!ELEMENT journal (contacts, issues, authors)>


В том случае, если используются одновременно внутренние и внешние описания, то программой-анализатором будут сначала рассматриваться внутренние, т.е. их приоритет выше. При проверке документа XML- процессор в первую очередь ищет DTD внутри документа. Если правила внутри документа не определены и не задан атрибут standalone ="yes", то программа загрузит указанный внешний файл и правила, находящиеся в нем, будут считаны оттуда. Если же атрибут standalone имеет значение "yes", то использование внешних DTD описаний будет запрещено.

Определение атрибутов

Списки атрибутов элемента определяются с помощью ключевого слова !ATTLIST. Внутри него задаются названия атрибутов, типы их значений и дополнительные параметры. Например, для элемента <article> могут быть определены следующие атрибуты:


<!ATTLIST article

id ID #REQUIREDCDATA #IMPLIED(actual | review | teach ) 'actual' ''>


В данном примере для элемента article определяются три атрибута: id, about и type, которые имеют типы ID(идентификатор), CDATA и список возможных значений соответственно. Всего существует шесть возможных типов значений атрибута:

·CDATA - содержимым документа могут быть любые символьные данные

·ID - определяет уникальный идентификатор элемента в документе

·IDREF (IDREFS )- указывает, что значением атрибута должно выступать названиет(или несколько таких названий, разделенных пробелами во втором случае) уникального идентификатора определенного в этом документе элемента

·ENTITY (ENTITIES) - значение атрибута должно быть названиемт(или списком названий, если используется ENTITIES) компонента (макроопределения), определенного в документе

·NMTOKEN (NMTOKENS) - содержимым элемента может быть только одно отдельное слово (т.е. этот параметр является ограниченным вариантом CDATA)

·Список допустимых значений - определяется список значений, которые может иметь данный атрибут.

Также в определении атрибута можно использовать следующие параметры:

·#REQUIRED - определяет обязательный атрибут, который должен быть задан во всех элементах данного типа

·#IMPLIED - атрибут не является обязательным

·#FIXED "значение" - указывает, что атрибут должен иметь только указанное значение, однако само определение атрибута не является обязательным, но в процессе разбора его значение в любом случае будет передано программе-анализатору

·Значение - задает значение атрибута по умолчанию

Определение компонентов(макроопределений)

Компонент (entity) представляет собой определения, содержимое которых может быть повторно использовано в документе. В других языках программирования подобные элементы называются макроопределениями. Создаются DTD- компоненты при помощи инструкции !ENTITY:


<!ENTITY hello ' Мы рады приветствовать Вас!' >


Программа-анализатор, просматривая в первую очередь содержимое области DTD- определений, обработает эту инструкцию и при дальнейшем разборе документа будет использовать содержимое DTD- компонента в том месте, где будет встречаться его название. Т.е. теперь в документе мы можем использовать выражение &hello, которое будет заменено на строчку "Мы рады приветствовать Вас"

В общем случае, внутри DTD можно задать три типа макроопределений:

Внутренние макроопределения - предназначены для определения строковой константы, с их помощью можно организовывать ссылки на часто изменяемую информацию, делая документ более читабельным. Внутренние компоненты включаются в документ при помощи амперсанта &

В XML существует пять предустановленных внутренних символьных констант:

·&amplt - символ "<"

·&ampgt - символ ">"

·&ampamp - символ "&"

·&ampapos - символ апострофа "&apos"

·&ampquot - символ двойной кавычки """

Внешние макроопределения - указывают на содержимое внешнего файла, причем этим содержимым могут быть как текстовые, так и двоичные данные. В первом случае в месте использования макроса будут вставлены текстовые строки, во втором - бинарные данные, которые анализатором не рассматриваются и используются внешними программами


<!ENTITY logotype SYSTEM "/image.gif" NDATA GIF87A>


Макроопределения правил - макроопределения параметров могут использоваться только внутри области DTD и обозначаются специальным символом %, вставляемым перед названием макроса. При этом содержимое компонента будет помещено непосредственно в текст DTD- правила. Например, для следующего фрагмента документа:


<!ELEMENT name (PCDATA)>

<!ELEMENT title (PCDATA | name)*>

<!ELEMENT author (PCDATA | name)*>

<!ELEMENT article (title, author)*>

<!ELEMENT book (title, author)*>

<!ELEMENT bookstore (book | article)*>

<!ELEMENT bookshelf (book | article)*>можно использовать более короткую форму записи:

<!ELEMENT name (PCDATA)>

<! ENTITY %names 'PCDATA | name'>

<!ELEMENT article (%names;)*>

<!ELEMENT book (%names;)*>

<!ENTITY %content 'book | article'>

<!ELEMENT bookstore (%content;)*>

<!ELEMENT bookshelf (%content;)*>


Макроопределения часто используются для описания параметров в правилах атрибутов. В этом случае появляется возможность использовать одинаковые определения атрибутов для различных элементов:


<!ENTITY %itemattr 'id ID #IMPLIED src CDATA'>

<!ENTITY %bookattr "ISDN ID #IMPLIED type CDATA'>

<!ENTITY %artattr " size CDATA'>

<!ELEMENT book (title, author,content)*>

<!ATTLIST book %itemattr %bookattr;>

<!ELEMENT article (title, author, content)*>

<!ATTLIST article %itemattr %artattr;>


Типизация данных. Довольно часто при создании XML- элемента разработчику требуется определить, данные какого типа могут использоваться в качестве его содержимого. Т.е. если мы определяем элемент <last-modified>10.10.98</last-modified>, то хотим быть уверенными, что в документе в этом месте будет находиться строка, представляющая собой дату, а не число или произвольную последовательность символов. Используя типизацию данных, можно создавать элементы, значения которых могут использоваться, например, в качестве параметров SQL- запросов. Программа клиент в этом случае должна знать, к какому типу данных относится текущее значение элемента и в случае соответствия формирует SQL-запрос.

Если в качестве программы на стороне клиента используется верифицирующий XML-процессор, то информацию о типе можно передавать при помощи специально созданного для этого атрибута элемента, имеющего соответствующее DTD- определение. В процессе разбора программа-анализатор передаст значение этого атрибута клиентскому приложению, которое сможет использовать эту информацию должным образом. Например, чтобы указать, что содержимое элемента должно быть длинным целым, можно использовать следующее DTD- определение:


<!ELEMENT counter (PCDATA)><!ATTLIST counter data_long CDATA #FIXED "LONG">


Задав атрибуту значение по умолчанию LONG и определив его как FIXED, мы позволили тем самым программе-клиенту получить необходимую информацию о типе содержимого данного элемента, и теперь она может самостоятельно определить соответствие типа этого содержимого указанному в DTD- определении.

Вот пример XML- документа, в котором используются несколько элементов с различными типами данных:


<!ELEMENT price (PCDATA)>

<!ATTLIST price data_currency CDATA #FIXED "CURRENCY">

<!ELEMENT rooms_num (PCDATA)>

<!ATTLIST rooms_num data_byte CDATA #FIXED "BYTE">

<!ELEMENT floor (PCDATA)>

<!ATTLIST floor data_byte CDATA #FIXED "INTEGER">

<!ELEMENT living_space (PCDATA)>

<!ATTLIST living_space data_float CDATA #FIXED "FLOAT">

<!ELEMENT counter (PCDATA)>

<!ATTLIST counter data_long CDATA #FIXED "LONG">

<!ELEMENT is_tel (PCDATA)>

<!ATTLIST is_tel data_bool CDATA #FIXED "BOOL">

<!ELEMENT house (rooms_num, floor,living_space, is_tel, counter, price)>

<!ATTLIST house id ID #REQUIED>...

<house id="0">

<rooms_num>5</rooms_num><floor>2</floor>

<living_space>32.5</living_space>

<is_tel>true</is_tel>

<counter>18346</counter>

<price>34 р. 28 к.</price></house>...


Как видно из примера, механизм создания элементов документа при этом нисколько не изменился. Все необходимая для проверки типов данных информация заложена в определения элементов внутри блока DTD. В заключении хотелось бы отметить, что DTD предоставляет нам весьма удобный механизм осуществления контроля за содержимым документа. На сегодняшний день, практически все программы просмотра документов Интернет используют DTD-правила. Однако это далеко не единственный способ проверки корректности документа. В настоящий момент в W3 консорциуме находится на рассмотрении новый стандарт языка описания структуры документов, называемый схемами данных. Следующий раздел посвящен работе с ними.


Создание меток и сущностей в DTD


Определение: XML документ может состоять из одной или нескольких единиц размещения, называемых сущностями. Все сущности имеют содержание (исключение составляют сущность документа <#"justify">Определение: Ссылка на символ относится к определенному символу из набора ISO/IEC 10646, например, к такому символу, который невозможно получить непосредственно с имеющихся устройств ввода.]

Ссылка на символ

[66] CharRef::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'[WFC: Допустимый символ] <#"justify">Ссылка на сущность

[67] Reference::= EntityRef <#"justify"> | CharRef <#"justify">[68] EntityRef::= '&' Name <#"justify"> ';'[WFC: Декларированная сущность] <#"justify">[69] PEReference::= '%' Name <#"justify"> ';'[VC: Декларированная сущность] <#"justify">Декларация сущности

[70] EntityDecl::= GEDecl <#"justify"> | PEDecl <#"justify">[71] GEDecl::= '<!ENTITY' <#"justify"> Name <#"justify"> <#"justify"> EntityDef <#"justify"> <#"justify">? '>'[72] PEDecl::= '<!ENTITY' <#"justify"> '%' <#"justify"> Name <#"justify"> <#"justify"> PEDef <#"justify"> <#"justify">? '>'[73] EntityDef::= EntityValue <#"justify"> | (ExternalID <#"justify"> NDataDecl <#"justify">?)[74] PEDef::= EntityValue <#"justify"> | ExternalID <#"justify">Внутренние сущности

Определение: Если сущность декларирована как EntityValue <#"justify">Внешние сущности

Определение: Если сущность не является внутренней, это внешняя сущность, декларируемая следующим образом:]


Декларация внешней сущности

[75] ExternalID::= 'SYSTEM' <#"justify"> SystemLiteral <#"justify">| 'PUBLIC' <#"justify"> PubidLiteral <#"justify"> <#"justify"> SystemLiteral <#"justify"> [76] NDataDecl::= <#"justify"> 'NDATA' <#"justify"> Name <#"justify">Обработка XML процессором сущностей и ссылок

В представленной далее таблице собраны сведения о контексте, в котором могут появиться ссылки на символы, ссылки на сущность, а также вызовы неразобранных сущностей, и какая в каждом случае потребуется реакция от XML процессора <#"justify">Ссылка в значении атрибута

Ссылка либо в значении атрибута начального тэга <#"justify">Значение атрибута

Это не ссылка, а лексема типа Name <#"justify">Ссылка в значении сущности

Ссылка из параметра или строкового значения <#"justify">Таблица 2.

Тип сущностиСимволПараметрВнутренняя общаяВнешняя разобранная общаяНеразобраннаяСсылка в содержимомНе распознается <#"justify">Ссылка в значении атрибутаНе распознается <#"justify">Значение атрибутаНе распознается <#"justify">Ссылка в значении сущностиВключается как строка <#"justify">Ссылка в DTDВключается как сущность параметра <#"justify">Описание технологии XML Path. Место технологии в XML


Язык XPath является результатом попыток создать единые синтаксис и семантику для функционала, совместно используемого XSL Transformations [XSLT] и XPointer [XPointer]. Главная задача языка XPath - адресация частей в XML документе [XML]. Для достижения этой цели язык дополнительно наделен основными функциями для манипулирования строками, числами и булевыми значениями. В XPath используется компактный синтаксис, отличный от принятого в XML, облегчающий использование языка XPath при записи адресов URI и значений атрибутов XML. XPath работает не с внешним синтаксисом XML документа, а с его абстрактной логической структурой. XPath получил такое название потому, что использовался в URL для записи путей, обеспечивающих навигацию по иерархической структуре XML документа.

Язык XPath спроектирован так, что помимо поддержки адресации он обладает естественным набором элементов, которые могут использоваться для сравнения (проверки, соответствует ли узел некому шаблону). Такой порядок использования языка XPath описывается в спецификации XSLT. представляет XML документ в виде дерева узлов. Узлы бывают различных типов, например, узлы элементов, узлы атрибутов и узлы текста. Для каждого типа узлов в XPath определяется способ вычисления строкового значения. Некоторые типы узлов имеют также имя. XPath полностью поддерживает пространства имен XML [XML Names]. В результате, имя любого узла в этом языке образуется из двух частей: локальной части и URI некого пространства имен (возможно, нулевого), такая комбинация называется расширенным именем.

Главной синтаксической конструкцией языка XPath является выражение. Любое выражение соответствует сценарию Expr. В результате обработки выражения получается объект, относящийся к одному из четырех основных типов:

·набор узлов (node-set) - неупорядоченный набор узлов без дубликатов

·булево значение (boolean) - true или false

·число (number) - число с плавающей точкой

·строка (string) - последовательность UCS символов

Обработка выражений осуществляется, отталкиваясь от некого контекста. В спецификациях XSLT и XPointer указывается, каким образом в XSLT и XPointer, соответственно, определяется контекст для выражений XPath. Контекст образуется из:

·узла (узел контекста, context node)

·пары ненулевых положительных целых чисел (положение в контексте и размер контекста)

·привязки переменных контекста (variable bindings)

·библиотеки функций

·набора деклараций пространства имен в области видимости данного выражения

Положение в контексте всегда меньше или равно размеру контекста.

Схема привязки переменных контекста образуется в результате отображения множества имен переменных на множество значений переменных. Значением переменной является объект, относящийся к одному из типов, допустимых для значений выражений, либо к какому-либо дополнительному типу, не описанному в спецификации.

Библиотека функций образуется в результате отображения множества названий функций на множество функций. Каждая функция имеет нуль или более аргументов и возвращает один результат. В данном документе описывается основная библиотека функций, которую должны поддерживать все реализации XPath. Для любой функции в основной библиотеке и аргументы, и результат выполнения относятся к четырем основным типам. И XSLT, и XPointer дополняют XPath, определяя дополнительные функции, часть новых функций оперирует с четырьмя основными типами, остальные - дополнительными типами данных, определенными в XSLT и XPointer. Декларации пространства имен образуются в результате отображения множества префиксов на множество идентификаторов URI пространств имен.

Привязка переменных контекста, библиотека функций и декларации пространства имен используются для обработки отдельных частей выражения и остаются неизменными на протяжении обработки всего выражения. Узел контекста, размер контекста и положение в контексте, используемые для обработки частей выражения, иногда могут отличаться от используемых для обработки выражения в целом. Некоторые типы выражений меняют текущий узел контекста, однако размер контекста и положение в контексте могут менять только предикаты. Если описывается обработка некоторого типа выражений, то всегда явно указывается, когда для обработки частей выражения используется другой узел контекста, измененные размер контекста или положение в контексте. Если же об узле контекста, размере контекста или положении в контексте в описании ничего не сказано, считается, что они остаются неизменными в ходе обработки всех подвыражений в выражении указанного типа.

Выражения XPath часто используются в атрибутах XML. Описываемая в этой главе грамматика примеряется к значению атрибута после выполнения нормализации, описанной в XML 1.0. Так, если, к примеру, в грамматике используется символ <, то в исходном XML документе его нельзя записывать просто как <. Вместо этого, согласно правилам XML 1.0, его необходимо маскировать, например, записав как &lt;. Строковые значения, используемые в выражениях, заключаются в одинарные или двойные кавычки, которые используются также для записи атрибутов XML. Поэтому, чтобы символ кавычки в этом выражении не интерпретировался XML процессором как конец значения атрибута, его необходимо записывать как ссылку на символ (&quot; или &apos;). Впрочем, если атрибут XML был заключен в двойные кавычки, в выражении можно свободно использовать символы одинарных кавычек, и наоборот.

Другим важным типом выражений является путь адресации (location path). Путь адресации выбирает некое множество узлов, отталкиваясь от некоторого узла контекста. Результатом обработки выражения, соответствующего пути адресации, является множество узлов, собранных согласно этому пути. Путь адресации может рекурсивно содержать выражения, используемые для фильтрации наборов узлов. Путь адресации соответствует сценарию LocationPath.

В представленной далее грамматике используются незавершенные конструктивы QName и NCName, описанные в [XML Names], а также пробельный символ S, описанный в [XML]. Грамматика использует ту же самую нотацию EBNF, что [XML] (за исключением того, что названия грамматических конструкций всегда пишутся с заглавной буквы).

Обработка выражения начинается с его разбиения на строки символов, подлежащих преобразованию в лексемы. Затем идет разбор полученной последовательности лексем. В промежутки между лексемами могут свободно ставиться пробельные символы.


Формирование запросов XPath


Абакан, 2009

XPath не рассчитан на работу с реляционными данными. Чтобы использовать XPath-запросы для выборки реляционных данных, необходимо создать схему данных XDR или XSD. XDR была разработана несколько лет назад при активном участии Microsoft, т.к. в то время необходимость в схемах данных была, а, по существу, самих схем не было. С появлением XSD популярность и актуальность применения XDR начали падать.

Схема данных выполняет две важные функции: задает структуру будущего XML-документа и определяет, какие поля и таблицы должны использоваться при выполнении запроса XPath. Такие схемы называются аннотированными схемами запросов, а атрибуты, связывающие объекты базы данных с XML-узлами - аннотациями. До выхода в свет SQLXML 2.0 можно было использовать только аннотированные схемы на основе SDR [6]. Однако сейчас лучше использовать аннотированные схемы на основе спецификации XSD [7]. Синтаксис шаблонов с использованием запросов XPath:


<your_root xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<sql:header>

<xql:param name="your_param_name"> param_value </sql:param>

<xql:param name="your_param_name"> param_value </sql:param>...n

</sql:header>

<sql:xpath-query mapping-schema="your_schema.xml">query

</sql:xpath-query>

</your_root>


В этом примере аннотированная схема должна находится в файле your_schema.xml. Как видно из синтаксиса, возможно создание параметризированных запросов XPath. Параметр в запросе обозначается начальным символом $.

Рассмотрим пример аннотированной схемы XDR, который будет использоваться для запросов XPath. В результирующем документе будут присутствовать имена, фамилии и адреса всех авторов:


<?xml version="1.0" ?>

<Schema xmlns="urn:schemas-microsoft-com:xml-data":sql="urn:schemas-microsoft-com:xml-sql":dt="urn:schemas-microsoft-com:datatypes">

<ElementType name="address" />

<ElementType name="Authors" sql:relation="Authors">

<AttributeType name="au_fname" dt:type="string" />

<AttributeType name="au_lname" dt:type="string" />

<attribute type="au_fname"/>

<attribute type="au_lname" />

<element type="address" sql:field="address"/>

</ElementType>

</Schema>


Здесь используется аннотация relation для того, чтобы указать, с какой таблицей будет связан элемент Authors. Дочерние элементы наследуют связь с таблицей, указанной для родительского ElementType. Связывание полей таблицы или представления (view) можно выполнять явно, с использованием аннотации field. В данном примере для элементов AttributeType этого делать не нужно, т.к. отображения на соответствующие поля выполняются автоматически. Однако для дочерних элементов ElementType, которые по умолчанию связываются с таблицами, такая аннотация может быть необходима. Наиболее часто используемые аннотации приведены далее.

Теперь можно перейти к самому шаблону. Предположим, аннотированную схему вы сохранили под именем MySchema.xml.

Вот так выглядит шаблон, выбирающий имена, фамилии и адреса всех авторов:


<my_root xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<sql:xpath-query mapping-schema="../Schema/MySchema.xml">

/Authors

</sql:xpath-query>

</my_root>


Так как схемы XDR постепенно вытесняются схемами XSD, перепишем пример с использованием XSD.

Вот список основных отличий XDR от XSD[9], к которому я очень часто обращаюсь:

XDR XSDschemaelementattributenone

С учетом этого схема будет выглядеть так:

<xsd:schema xmlns:xsd="#"justify">xmlns:sql="urn:schemas-microsoft-com:mapping-schema">

<xsd:element name="authors" sql:relation="authors">

<xsd:complexType>

<xsd:attribute name="au_fname" sql:field="au_fname" />

<xsd:attribute name="au_lname" sql:field="au_lname" />

<xsd:attribute name="address" sql:field="address" />

</xsd:complexType>

</xsd:element>

</xsd:schema>


Здесь явно указаны аннотации, позволяющие связать XML-элементы с таблицей authors и соответствующими полями. В данном случае все они не обязательны, т. к. SQLXML может вывести связи из названий узлов. Вот пример, где аннотации действительно необходимы. Для разнообразия адрес и фамилия вынесены в отдельные элементы:


<?xml version="1.0" encoding="windows-1251" ?>

<xsd:schema xmlns:xsd="#"justify"><xsd:element name="Авторы" sql:relation="authors">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="Фамилия" sql:field="au_lname"/>

<xsd:element name="Адрес" sql:field="address" />

</xsd:sequence>

<xsd:attribute name="Имя" sql:field="au_fname"/>

</xsd:complexType>

</xsd:element>

</xsd:schema>


Если схема находится в виртуальном каталоге, тип которого schema, вы можете выполнять XPath-запросы, непосредственно указывая их в URL. Результирующий документ может не иметь корневого элемента, поэтому не забывайте указывать параметр root.

://server/server_pubs/schema/xsd_map_schema.xml/Авторы?root=root


Вот другие аннотации, часто используемые в схемах:- элемент, обозначающий связь с соответствующими друг другу первичными и внешними ключами. Используется для построения иерархических XML-документов. constant - указывает, что соответствующий элемент не связывается с таблицей или колонкой базы данных. field - булева переменная, принимающая значение 0 или 1. Значение 0 указывает, что соответствующий элемент не будет присутствовать в результирующем документе. С выходом SQLXML 3.0 аннотация была переименована в mapped. field и limit-value - предназначены для указания поля и его значения, по которым будет фильтроваться запрос к базе данных. Результат использования этих аннотаций аналогичен ограничению результирующего набора строк с помощью оператора WHERE. cdata - указывает, что соответствующий XML-узел будет представлен в секции CDATA результирующего документа. Узел должен быть связан с полем таблицы или представления и не может применяться совместно с url-encode или ID, IDREF, IDREFS, NMTOKEN и NMTOKENS. - булева переменная, принимающая значение 0 или 1. Указывает на то, что соответствующий XML-узел будет скрыт (значение 0) в результирующем XML-документе, однако может быть использован в запросе XPath. Не путайте её с аннотацией mapped. Различие в том, что при помощи mapped XML-узел совсем исключается из документа, так что не может быть использован в запросе XPath.

Рассмотрим пример, демонстрирующий работу некоторых из перечисленных аннотаций. В разделе FOR XML EXPLICIT был составлен иерархический список издательств и служащих, которые в них работают. Попробуем получить такой же XML-документ с помощью аннотированной схемы:


<?xml version="1.0" ?>

<xsd:schema xmlns:xsd="#"justify">xmlns:sql="urn:schemas-microsoft-com:mapping-schema">

<xsd:annotation>

<xsd:appinfo>

<sql:relationship name="PubsEmployees"="publishers" parent-key="pub_id"="employee" child-key="pub_id" />

</xsd:appinfo>

</xsd:annotation>

<xsd:element name="pubs" sql:relation="publishers">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="employee":relation="employee":relationship="PubsEmployees" >

<xsd:complexType>

<xsd:attribute name="First_Name" sql:field="fname" ="xsd:string" />

<xsd:attribute name="Last_Name" sql:field="lname" ="xsd:string" />

<xsd:attribute name="minit" sql:field="minit" ="xsd:string" sql:hide="1" />

</xsd:complexType>

</xsd:element>

</xsd:sequence>

<xsd:attribute name="PubName" sql:field="pub_name" type="xsd:string"/>

<xsd:attribute name="City" sql:field="city" type="xsd:string" :limit-field="pub_name" sql:limit-value="Binnet &amp; Hardley" />

</xsd:complexType>

</xsd:element>

</xsd:schema>


Здесь использован атрибут hide для удаления XML-узла из результирующего документа, но сохранить возможность его использования в XPath-запросах. Атрибуты limit-field и limit-value ограничивают количество издательств одним - «Binnet & Hardley». Раздел xsd:annotation вынесен, однако его можно было использовать и внутри узла <xsd:element name="employee"…>. В таком случае имя элемента relationship можно было не указывать.

Примерно так можно использовать эту схему:

://server/server_pubs/schema/schema1.xml/pubs/employee[@minit=""]?root=root


Схемы можно непосредственно указывать в шаблоне. Например:

<?xml version="1.0" encoding="windows-1251" ?>

<my_root xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<xsd:schema xmlns:xsd="#"justify"><xsd:element name="Авторы" ms:relation="authors">

<xsd:complexType>

<xsd:attribute name="Имя" ms:field="au_fname"/>

<xsd:attribute name="Фамилия" ms:field="au_lname"/>

<xsd:attribute name="Адрес" ms:field="address"/>

</xsd:complexType>

</xsd:element>

</xsd:schema>

<sql:xpath-query mapping-schema="#InLineSchema1">

/Авторы

</sql:xpath-query>

</my_root>


Для того чтобы запрос XPath использовал схему, а также для сокрытия ее в результирующем документе XML, указан атрибут is-mapping-schema. Он может принимать значения 0 или 1. Кроме этого, необходимо явно сослаться на используемую схему, так как их в шаблоне может быть несколько. Это делается путем добавления атрибута id в схему и атрибута mapping-schema - в раздел самого запроса.

Создание аннотированных схем не совсем тривиальная задача, требующая к тому же знания большого количества тонкостей. К счастью, в Microsoft разработали специальный инструмент для автоматической генерации схем - XML View Mapper. Его можно бесплатно скачать по адресу #"justify">К сожалению, SQL Server 2000 лишь частично поддерживает спецификацию XPath и возможности использования XPath-запросов к базе данных. Ниже приведена сводка поддерживаемых и не поддерживаемых возможностей.

Поддерживаемая функциональность XPath:



Не поддерживаемая функциональность:



В качестве простых запросов (query) могут выступать любые SQL-инструкции. Шаблоны могут быть использованы для изменения данных, хотя это и не лучшее решение. Другие методы изменения данных рассматриваются в разделе Апдейтаграммы и XML Bulk Load.


Использование запросов XPath


XML-документы представляют собой иерархию, или дерево узлов, в чем-то схожее с иерархией каталогов и файлов в файловой системе. Этом и объясняется сходство синтаксиса URL и XPath. В следующей таблице приведено сравнение некоторых свойств.


Таблица 3.

Файловая система (URL)XPathИерархия каталогов и файлов.Иерархия элементов и других узлов XML-документа.Файлы на каждом из уровней имеют уникальные имена. URL всегда идентифицирует один файл.Имена элементов на каждом уровне могут быть неуникальны. Шаблоны XPath соответствуют набору всех соответствующих элементов.Путь вычисляется относительно конкретного каталога, именуемого текущим каталогом.Путь вычисляется относительно конкретного узла, в запросе именуемого контекстом.

В следующем фрагменте XML-документа представлена простая иерархия, которая будет использоваться для демонстрации некоторых основных возможностей XPath-запросов.


<authors>

<author>

<name>Victor Hugo</name>

<nationality>French</nationality>

</author>

<author period="classical">

<name>Sophocles</name>

<nationality>Greek</nationality>

</author>

<author>

<name>Leo Tolstoy</name>

<nationality>Russian</nationality>

</author>

<author>

<name>Alexander Pushkin</name>

<nationality>Russian</nationality>

</author>

<author period="classical">

<name>Plato</name>

<nationality>Greek</nationality>

</author>

</authors>


При исполнении XPath-запроса всегда имеется так называемый контекст исполнения, то есть текущая ветка, относительно которой производится поиск. Это сходно с активным каталогом при выполнении команды CD файловой системы. Как контекст XPath-запроса может использоваться любой узел XML-документа. В XSLT контекстом для запроса является узел, в данный момент обрабатываемый элементами <xsl:template> или <xsl:for-each>. При использовании XPath непосредственно из DOM вы определяете контекст, выполняя запрос из конкретного узла. Приведенные ниже примеры используют контекст корневого элемента XML-документа.

Основным понятием XPath является путь в XML-иерархии. Если выполнить приведенный ниже запрос, начиная с корневого элемента приведенного выше примера, этот запрос проходит по иерархии вплоть до элемента <name>.

authors/author/name


Запрос XPath распознает все элементы, соответствующие пути. Поскольку XSLT позволяет выделять определенные узлы дерева, его можно использовать в качестве простого поискового механизма.

Кроме описания пути, XPath может включать wildcards (групповые символы). Элемент с любым именем обозначается символом "*".


authors/*/name


Предыдущий запрос соответствует всем элементам name, но не требует, чтобы они находились в элементе <author>. Вот еще один пример, находящий элементы <name> и <nationality>.


authors/author/*


Ветвления пути могут быть описаны с помощью квадратных скобок. Следующий запрос ищет ветку элемента <author>, и означает, что рассматриваться должны только элементы <author> с дочерним nationality.


authors/author[nationality]/name


В запросе можно использовать операторы сравнения. Следующий запрос возвращает имена русских авторов. Заметьте, что сравнения можно использовать только в квадратных скобках.


authors/author[nationality='Russian']/name


XML-атрибуты в запросе обозначаются символом "@" перед именем атрибута. Атрибут может проверяться как ветка основного пути, но запрос может и целенаправленно искать узлы атрибутов. Следующий пример возвращает авторов классического периода.


authors/author[@period="classical"]


Таблица 4.Операторы и специальные символы Xpath

ОператорОписание/Выбирает дочерние элементы коллекции, находящейся слева от него. При использовании в начале шаблона означает поиск от корневого элемента.//Рекурсивный спуск; ищет указанный элемент на любой глубине. При использовании в начале шаблона означает рекурсивный поиск от корневого элемента..Текущий контекст.*Wildcard, выбирает все элементы, независимо от имени.@Атрибут; префикс имени атрибута. При использовании без имени атрибута выбирает все атрибуты, независимо от их имени.:Сепаратор пространств имен. Отделяет префикс пространства имен от имени элемента или атрибута.( )Группирует операции для явного задания очередности.[ ]Накладывает фильтр. 2. Используется для индексации коллекции+Сложение.-Вычитание.divДеление с плавающей точкой (согласно IEEE 754).*Умножение.modВозвращает остаток при делении с остатком.


Федеральное агентство по образованию Государственное образовательное учреждение среднего профессионального образования Хакасский политехнический коллед

Больше работ по теме:

Стандартные приложения Windows и работа с ними
Контрольная работа
Схема сбора информации с логических входов
Контрольная работа
Таблица Excel
Контрольная работа
Финансовый анализ в Excel
Контрольная работа
Фотоколлаж на основе игры "CrossFire"
Контрольная работа

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ