Язык XML - Описание технологии. Архив рубрики: Книги по XML и XSLT

08.07.2019

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

На смену HTML был предложен язык гипертекстовой разметки XML (Extensible Markup Language). Этот язык может использоваться для описания грамматики других языков и для контроля правильности составления документов. XML определяет порядок создания тегов, предназначенных для разметки и позволяет легко их расширить. Таким образом появляется возможность определять собственные теги, позволяющие определять данные, содержащиеся в документе. При создании структуры документа, строятся связи между элементами и разметка, необходимая для выполнения операций просмотра, поиска, анализа документа. XML можно использовать в качестве универсального языка запросов к хранилищам информации. Таким образом, XML-документы могут выступать в качестве уникального способа хранения данных, включающего в себя средства для разбора информации и ее представления.

Язык XML привлекает к себе много внимания со стороны разработчиков и пользователей Интернет. Появляются новые языки, созданные на основе XML, возникают Web-сервера, использующие эту технологию для организации хранящейся на них информации. Полные спецификации XML и связанных с ним языков доступны на официальной странице W3C - www.w3.org

Годом рождения XML можно считать 1998 год, когда спецификация языка была утверждена. А началось всё с появления в 1986 году языка SGML. Хотя понятие гипертекста было введено В.Бушем еще в 1945 году и, начиная с 60-х годов, стали появляться приложения, использующие гипертекстовые данные, всплеск активности вокруг этой технологии начался тогда, когда возникла реальная необходимость в механизме объединения множества информационных ресурсов, обеспечения возможности создания, просмотра текста. С помощью SGML можно описывать структурированные данные, организовывать информацию, содержащуюся в документах, представлять эту информацию в некотором стандартизованном формате. Язык SGML предназначен для создания других языков разметки, он определяет допустимый набор тэгов, их атрибуты и внутреннюю структуру документа. Контроль за правильностью использования дескрипторов осуществляется при помощи специального набора правил, называемых DTD- описаниями, которые используются программой клиента при разборе документа. Для каждого класса документов определяется свой набор правил, описывающих грамматику соответствующего языка разметки. Но в виду своей сложности, SGML использовался, в основном, для описания синтаксиса других языков, наиболее известным из которых является HTML.

HTML является упрощенной версией языка разметки SGML. Гораздо более простой и удобный, чем SGML, язык HTML позволяет определять оформление элементов документа и имеет некий ограниченный набор инструкций - тэгов, при помощи которых осуществляется процесс разметки. Инструкции HTML, в первую очередь, предназначены для управления процессом вывода содержимого документа на экране программы-клиента и определяют этим самым способ представления документа, но не его структуру. В качестве элемента гипертекстовой базы данных, описываемой HTML, используется текстовый файл, который может легко передаваться по сети с использованием протокола HTTP. Эта особенность, а также то, что HTML является открытым стандартом и огромное количество пользователей имеет возможность применять возможности этого языка для оформления своих документов, безусловно, повлияли на рост популярности HTML и сделали его сегодня главным механизмом представления информации в Web

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

Самый популярный на сегодняшний день язык гипертекстовой разметки HTML, был создан специально для организации информации, распределенной в сети Интернет, и является одной из ключевых составляющих технологии WWW. С использованием гипертекстовой модели документа способ представления разнообразных информационных ресурсов в сети стал более упорядочен, а пользователи получили удобный механизм поиска и просмотра нужной информации.

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

rose,

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

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

Подводя итог всему сказанному, можно утверждать, что HTML не во всем удовлетворяет в полной мере требованиям, предъявляемым разработчиками к языкам подобного рода. HTML дополняет язык гипертекстовой разметки XML, мощный, гибкий, и удобный язык. В чем же заключается его достоинства?

Что такое XML?

Термин XML обозначает особую разновидность гипертекстовых документов. Чем же плохи обычные текстовые документы и что особенного есть в XML-документах?

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

Фактически XML - это способ разметки документов, предназначенный для формирования в документах какой-либо структуры и определения отношений между различными элементами этой структуры. Для создания такой разметки служат специальные инструкции, называемые тегами. Теги располагают между символами < и >. Благодаря наличию тегов становится возможной унифицированная автоматическая обработка и форматирование XML-документов. Благодаря XML удается также контролировать правильность данных, хранящихся в документах, а также установить единый стандарт на структуру документов, в которых могут содержаться произвольные данные. XML незаменим при построении сложных информационных систем, в которых очень важным является вопрос обмена информацией между различными потребителями. Благодаря XML можно избавиться от многих проблем, связанных с несовместимостью используемых различными компонентами.

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

ПРАЙМ-ТАСС

</p><p>Первый серийный самолет "Ту-214" производства КАПО</p><p>совершил первый испытательный полет</p><p>самолета Ту-214, выпущенный в серийном исполнении</p><p>на Казанском авиационно-производственном объединении</p><p>/КАПО/, совершил первый испытательный полет. Об</p><p>этом ПРАЙМ-ТАСС сообщили в Финансовой лизинговой</p><p>компании /ФЛК/.</p><p>Самолет изготовлен для хабаровской авиакомпании</p><p>"Дальавиа" в рамках соглашения, заключенного в 2000</p><p>году между "Дальавиа" и ФЛК, предусматривающего передачу в</p><p>лизинг двух Ту-214, производимых на КАПО. Ту-214</p><p>предназначен для перевозки 164 пассажиров на расстояние</p><p>7,2 тыс км на маршрутах Москва-Хабаровск, а также в Корею</p><p>Общие затраты на подготовку производства самолета составили</p><p>1,2 млрд руб. Из бюджета страны на эти цели было выделено</p><p>всего 1,5 млн руб. Подготовка к производству велась за счет</p><p>средств КАПО и бюджета Татарстана, а также полного</p><p>освобождения предприятия от республиканского и местных</p><p>налогов. Из республиканского бюджета на сертификацию</p><p>самолета было выделено 97 млн руб, а также 275 млн руб</p><p>для запуска механизма лизинга.</p><p>Предварительная стоимость Ту-214 составляет 22-25 млн долл.</p><p></InfoItem></p><p></InfoPacket></p> </td> </tr></table><p>Первые две строчки в этом примере должны присутствовать. Первая строчка означает, что данный документ является XML-документом, а вторая указывает на специальный ресурс <u>http://xml.prime-tass.ru/dtd/UIF.dtd </u>, в котором содержатся правила оформления данного XML-документа). Более подробную информацию по этим "волшебным словам" и не только можно получить на сайте <u>http://www.w3.org </u>.</p><p>Остальные строчки имеют явно выраженную иерархическую структуру, в которой есть один корневой тег <b><InfoPacket> </b>, а остальные теги вложены в него. Все эти теги встечаются парами, например, <b><InfoPacket> </b> и <b></InfoPacket> </b>, или <b><Text> </b> и <b></Text> </b>. Первые - обозначают открывающийся тег, вторые - парный ему закрывающийся. В XML-документе каждый открывающийся тег обязан иметь парный ему закрывающийся.</p><p>Тег <b><InfoPacket> </b> является самым главным тегом - корнем иерархической структуры и предназначен для хранения вложенных в него остальных тегов. Таким образом, он представляет собой своеобразный "конверт" или "обертку" - информационный пакет. В него вложены теги <b><Source> </b>, <b><Time> </b> и <b><InfoItem> </b>. Тег <b><Source> </b> содержит сведения об источнике информации, заключенной в данном информационном пакете ("адрес отправителя"). В теге <b><Time> </b> указано время создания информационного пакета ("время заклеивания конверта"). И, наконец, в теге <b><InfoItem> </b> находится собственно "письмо" - фактическое смысловое наполнение информационного пакета. Что же содержится в этом "письме"? В нем находятся теги <b><Time> </b>, <b><Title> </b> и <b><Text> </b>. В теге <b><Time> </b>, вложенном в тег <b><InfoItem> </b> указано когда наше "письмо" было написано, т.е. время написания содержимого <b><InfoItem> </b>. Не следует путать это время с моментом "заклеивания конверта" (созданием информационного пакета <b><InfoPacket> </b>). Обычно сначала пишут "письмо", а потом "заклеивают конверт" с ним. Кстати, если получателей несколько, то придется "заклеить" несколько "конвертов" с одинаковыми копиями "письма". Или возможна ситуация, когда нужно положить в один конверт несколько "писем" для одного получателя. В этом случае придется поместить внутри тега <b><InfoPacket> </b> несколько тегов <b><InfoItem> </b>. Кроме тега <b><Time> </b> в <b><InfoItem> </b> вложен тег <b><Title> </b>, в котором написан заголовок документа или "письма", если продолжить нашу аналогию. И, наконец, остался тег <b><Text> </b>, который несколько раз встречается внутри тега <b><InfoItem> </b>. Этот тег <b><Text> </b> обозначает просто абзацы документа.</p><p>Осталось только сказать, что означают и для чего нужны записи, типа <b>type="datetime" </b> или <b>type="string" </b> внутри названий тегов <b><Source> </b>, <b><Time> </b> и <b><Title> </b> и почему их нет в тегах <b><Text> </b>. Такого рода записи в XML называются атрибутами тегов. В данном случае мы имеем один атрибут <b>type </b>, который принимает значения <b>"datetime" </b> и <b>"string" </b>. Значения атрибутов в XML всегда заключаются в кавычки. Атрибут <b>type </b> нужен для того, чтобы точно указать как следует интерпретировать последовательность символов, заключенную внутри тега с этим атрибутом. Значение <b>"datetime" </b> означает, что значение тега нужно интерпретировать как дату и время, а значение <b>"string" </b> - как обычную строку. У тега <b><Text> </b> атрибут <b>type </b> отсутствует, т.к. по смыслу этого тега и так ясно, что в этом теге содержится текстовая строка.</p><p>XML - это язык разметки, описывающий целый класс объектов данных, называемых XML- документами. Этот язык используется в качестве средства для описания грамматики других языков и контроля за правильностью составления документов. Т.е. сам по себе XML не содержит никаких тэгов, предназначенных для разметки, он просто определяет порядок их создания. Таким образом, если, например, мы считаем, что для обозначения элемента <i>rose </i>в документе необходимо использовать тэг <i><flower> </i>;, то XML позволяет свободно использовать определяемый нами тэг и мы можем включать в документ фрагменты, подобные следующему:</p><p><flower>rose</flower></p><p>Набор тэгов может быть легко расширен. Если, предположим, мы хотим также указать, что описание цветка должно по смыслу идти внутри описания оранжереи, в которой он цветет, то просто задаем новые тэги и выбираем порядок их следования:</p><p><conservatory></p><p><flower>rose</flower></p><p></conservatory></p><p>Если мы хотим посадить туда еще несколько цветочков, то должны внести следующие изменения:</p><p><conservatory></p><p><flower>rose</flower></p><p><flower>tulip</flower></p><p><flower>cactus</flower></p><p></conservatory></p><p>Как видно, сам процесс создания XML документа очень прост и требует от нас лишь базовых знаний HTML и понимания тех задач, которые мы хотим выполнить, используя XML в качестве языка разметки. Таким образом, у разработчиков появляется уникальная возможность определять собственные команды, позволяющие им наиболее эффективно определять данные, содержащиеся в документе. Автор документа создает его структуру, строит необходимые связи между элементами, используя те команды, которые удовлетворяют его требованиям и добивается такого типа разметки, которое необходимо ему для выполнения операций просмотра, поиска, анализа документа.</p><p>Еще одним из очевидных достоинств XML является возможность использования его в качестве универсального языка запросов к хранилищам информации. Сегодня в глубинах W3C находится на рассмотрении рабочий вариант стандарта XML-QL(или XQL), который, возможно, в будущем составит серьезную конкуренцию SQL. Кроме того, XML-документы могут выступать в качестве уникального способа хранения данных, который включает в себя одновременно средства для разбора информации и представления ее на стороне клиента. В этой области одним из перспективных направлений является интеграция Java и XML - технологий, позволяющая использовать мощь обеих технологий при построении машинно-независимых приложений, использующих, кроме того, универсальный формат данных при обмене информации.</p><p>XML позволяет также осуществлять контроль за корректностью данных, хранящихся в документах, производить проверки иерархических соотношений внутри документа и устанавливать единый стандарт на структуру документов, содержимым которых могут быть самые различные данные. Это означает, что его можно использовать при построении сложных информационных систем, в которых очень важным является вопрос обмена информацией между различными приложениями, работающими в одной системе. Создавая структуру механизма обмена информации в самом начале работы над проектом, менеджер может избавить себя в будущем от многих проблем, связанных с несовместимостью используемых различными компонентами системы форматов данных.</p><p>Также одним из достоинств XML является то, что программы-обработчики XML- документов не сложны и уже сегодня появились и свободно распространяются всевозможные программные продукты, предназначенные для работы с XML-документами. XML поддерживается сегодня в Microsoft Internet Explorer 4/0 и в бэта-версиях IE5. Было заявлено о его поддержке в последующих версиях Netscape Communicator, СУБД Oracle, DB-2, в приложениях MS-Office . Все это дает основания предполагать, что, скорее всего, в ближайшем будущем XML станет основным языком обмена информации для информационных систем, заменив собой, тем самым, HTML. На основе XML уже сегодня созданы такие известные специализированные языки разметки, как SMIL, CDF, MathML, XSL, и список рабочих проектов новых языков, находящихся на рассмотрении W3C, постоянно пополняется.</p> <p>XML - очень популярный и гибкий формат в наше время. Каждый программист должен понимать его, это просто must have. Многие технологии завязаны сегодня активно его используют, при чем современные в их числе. </p><h2>Вступление</h2>Здравствуйте, дорогие читатели моей статьи. Сразу хочу сказать, что это только первая статья в моём цикле из трёх статей. Основная цель всего цикла – посвятить каждого читателя в XML и дать, если не полное разъяснение и понимание, то, хотя бы, хороший такой толчок к нему, объяснив основные моменты и вещи. <b>Весь цикл будет для одной номинации – «Внимание к деталям» </b>, а разделение на 3 статьи сделано для того, чтобы вмещаться в лимит символов в постах и разделить большое количество материала на более маленькие порции для большего понимания. Первая статья будет посвящена самому XML и что это такое, а так же одному из способов составления схемы для XML файлов – DTD. Для начала, хотелось бы высказать небольшое предисловие для тех, кто вообще еще не знаком с XML: не нужно пугаться. XML не очень сложный и с ним нужно разобраться любому программисту, так как это очень гибкий, эффективный и популярный формат файлов на сегодняшний день для хранения разнообразной информации, какой вы только захотите. XML используется в Ant, Maven, Spring. Любому программисту нужно знание XML. Теперь, когда вы собрались силами и мотивацией, давайте приступать к изучению. Весь материал я буду пытаться выложить максимально просто, собрав только самое важное и не вдаваться в дебри. <h3>XML</h3>Для более ясного объяснения, правильней будет визуализировать XML примером. < ? xml version= "1.0" encoding= "UTF-8" ? > <span>< company> </span> <span>< name> </span>IT- Heaven< / name> <span>< offices> </span> < office floor= "1" room= "1" > <span>< employees> </span> <span>< employee> </span> <span>< name> </span>Maksim< / name> <span>< job> </span>Middle Software Developer< / job> < / employee> <span>< employee> </span> <span>< name> </span>Ivan< / name> <span>< job> </span>Junior Software Developer< / job> < / employee> <span>< employee> </span> <span>< name> </span>Franklin< / name> <span>< job> </span>Junior Software Developer< / job> < / employee> < / employees> < / office> < office floor= "1" room= "2" > <span>< employees> </span> <span>< employee> </span> <span>< name> </span>Herald< / name> <span>< job> </span>Middle Software Developer< / job> < / employee> <span>< employee> </span> <span>< name> </span>Adam< / name> <span>< job> </span>Middle Software Developer< / job> < / employee> <span>< employee> </span> <span>< name> </span>Leroy< / name> <span>< job> </span>Junior Software Developer< / job> < / employee> < / employees> < / office> < / offices> < / company> HTML и XML похожи синтаксисом, так как у них общий родитель – SGML. Однако, в HTML есть только фиксированные теги конкретного стандарта, в то время, как в XML вы можете создавать свои собственные теги, атрибуты и, в целом, делать все, что захотите, чтобы хранить данные так, как вам будет удобно. По сути, XML файлы может прочитать любой человек, знающий английский язык. Изобразить данный пример можно с помощью дерева. <b>Корень дерева </b> – Company. Он же – корневой (рут) элемент, от которого идут все остальные элементы. <i>В каждом XML файле может быть только один рут элемент. </i> Он должен объявляться после <i>декларации xml файла </i> (первая строчка в примере) и вмещать в себе все другие элементы. Немного о декларации: она <i>обязательная </i> и нужна для идентификации документа как XML. У неё есть три псевдо-атрибуты (специальные предопределенные атрибуты): version (по стандарту 1.0), encoding (кодировка) и standalone (автономность: если yes и к документу подключаются внешние схемы, то будет ошибка, по умолчанию - no). <b>Элементы </b> – это сущности, которые хранят данные с помощью других элементов и атрибутов. <b>Атрибуты </b> – это дополнительная информация об элементе, которая указывается при добавлении элемента. Если перевести объяснение на ООП-поле, то можно привести такой пример: у нас есть машина, у каждой машины есть характеристики (цвет, вместимость, марка и другое) – это атрибуты, и есть сущности, которые внутри машины: двери, окна, двигатель, руль – это другие элементы. Хранить свойства можно как и отдельными элементами, так и атрибутами в зависимости от вашего желания. Как никак, XML – крайне гибкий формат хранения информации про что-либо. После объяснений, нам достаточно разобрать пример выше, чтобы все встало на свои места. В примере мы описали простую структуру компании: есть компания, у которой есть имя и офисы, а в офисах есть сотрудники. Элементы Employees и Offices – элементы-обертки – они служат для того, чтобы собрать в себе элементы одного вида, по сути, соединив их в одно множество для удобства их обработки. Отдельного внимания заслуживают floor и room. Это – атрибуты офиса (этаж и номер), другими словами – его свойства. Если бы у нас был элемент «картинка», то можно было бы передавать её размеры. Вы можете заметить, что у компании нет атрибута name, но есть элемент name. Просто вы можете описывать структуры так, как захотите. Никто не обязывает вас все свойства элементов записывать только в атрибуты, вы можете использовать и просто элементы и записывать внутри них какие-то данные. Например, мы можем записывать имя и должность наших работников, как атрибуты: < ? xml version= "1.0" encoding= "UTF-8" ? > <span>< company> </span> <span>< name> </span>IT- Heaven< / name> <span>< offices> </span> < office floor= "1" room= "1" > <span>< employees> </span> < employee name= "Maksim" job= "Middle Software Developer" > < / employee> < employee name= "Ivan" job= "Junior Software Developer" > < / employee> < employee name= "Franklin" job= "Junior Software Developer" > < / employee> < / employees> < / office> < office floor= "1" room= "2" > <span>< employees> </span> < employee name= "Herald" job= "Middle Software Developer" > < / employee> < employee name= "Adam" job= "Middle Software Developer" > < / employee> < employee name= "Leroy" job= "Junior Software Developer" > < / employee> < / employees> < / office> < / offices> < / company> Как вы видите, теперь имя и должность каждого работника – это его атрибуты. И можно заметить, что внутри сущности (тега) employee ничего нет, все элементы employee – пустые. Тогда можно сделать employee пустым элементом – закрыть его сразу после объявления атрибутов. Это делается довольно просто, достаточно просто поставить слэш: < ? xml version= "1.0" encoding= "UTF-8" ? > <span>< company> </span> <span>< name> </span>IT- Heaven< / name> <span>< offices> </span> < office floor= "1" room= "1" > <span>< employees> </span> < employee name= "Maksim" job= "Middle Software Developer" / > < employee name= "Ivan" job= "Junior Software Developer" / > < employee name= "Franklin" job= "Junior Software Developer" / > < / employees> < / office> < office floor= "1" room= "2" > <span>< employees> </span> < employee name= "Herald" job= "Middle Software Developer" / > < employee name= "Adam" job= "Middle Software Developer" / > < employee name= "Leroy" job= "Junior Software Developer" / > < / employees> < / office> < / offices> < / company> Как вы можете заметить, закрыв пустые элементы мы сохранили всю целостность информации и намного сократили запись, сделав информацию более сжатой и читабельной. Для того, чтобы добавить <i>комментарий </i> (текст, который будет пропускаться при парсинге файла) в XML, есть следующий синтаксис: < ! -- Иван недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка. -- > И последняя конструкция – это <i><u>CDATA </u> </i>, означает «символьные данные». Благодаря данной конструкции, можно записывать текст, который не будет интерпретироваться как разметка XML. Это полезно, если внутри XML файла у вас есть сущность, которая хранит в информации XML разметку. Пример: < ? xml version= "1.0" encoding= "UTF-8" ? > <span>< bean> </span> <span>< information> </span> < ! [ CDATA[ <span>< name> </span>Ivan< / name> <span>< age> </span>26 < / age> ] ] > < / information> < / bean> Особенность XML в том, что вы можете расширять его так, как захотите: использовать свои элементы, свои атрибуты и структурировать его по своему желанию. Вы можете использовать для хранения данных как атрибуты, так и элементы (как это было показано в примере ранее). Однако нужно понимать, что придумывать свои элементы и атрибуты на ходу и как вы захотите вы можете, но что, если вы будете работать на проекте, где другой программист захочет перенести элемент name в атрибуты, а у вас вся логика программы написана так, чтобы name был элементом? Как же создать свои собственные правила того, какие элементы должны быть, какие атрибуты у них есть и другие вещи, чтобы можно было проводить валидацию XML файлов и быть уверенным, что правила станут стандартными в вашем проекте и никто их нарушать не будет? Для того, чтобы написать все правила вашей собственной XML разметки, есть специальные средства. Самые известные: DTD и XML Schema. В этой статье будет только про первое. <h2>DTD</h2>DTD создан для того, чтобы описывать типы документов. DTD уже устаревает и сейчас от него активно отказываются в XML, однако еще много XML файлов используют именно DTD и, в целом, его полезно понимать. <b>DTD – это технология валидации XML-документов </b>. DTD объявляет конкретные правила для типа документа: его элементы, какие элементы могут быть внутри элемента, атрибуты, обязательные они или нет, количество их повторений, а так же сущности (Entity). По аналогии с XML, для более ясного объяснения DTD можно визуализировать примером. < ! -- Объявление возможных элементов -- > < ! ELEMENT employee EMPTY> < ! ELEMENT employees (employee+ ) > < ! ELEMENT office (employees) > < ! ELEMENT offices (office+ ) > < ! ELEMENT name (#PCDATA) > < ! ELEMENT company (name, offices) > < ! -- Добавление атрибутов для элементов employee и office -- > < ! ATTLIST employee name CDATA #REQUIRED job CDATA #REQUIRED > < ! ATTLIST office floor CDATA #REQUIRED room CDATA #REQUIRED > < ! -- Добавление сущностей -- > < ! ENTITY M "Maksim" > < ! ENTITY I "Ivan" > < ! ENTITY F "Franklin" > Вот такой вот простой пример у нас есть. В данном примере, мы объявили всю нашу иерархию из XML примера: работник, работники, офис, офисы, имя, компания. Для создания DTD файлов служат 3 основные конструкции, чтобы описывать любые XML файлы: ELEMENT (для описания элементов), ATTLIST (для описания атрибутов для элементов) и ENTITY (для подстановки текста сокращенными формами). <b>ELEMENT </b> Служит для описания элемента. Элементы, которые можно использовать внутри описанного элемента, перечисляются в скобках в виде списка. Можно использовать квантификаторы для указания количества (они аналогичны с квантификаторами из регулярных выражений): + значит 1+ * значит 0+ ? значит 0 ИЛИ 1 <b>Если квантификаторов не было добавлено, то считается, что должен быть только 1 элемент. </b> Если бы нам нужен был один из группы элементов, можно было бы написать так: < ! ELEMENT company ((name | offices) ) > Тогда выбирался бы один из элементов: name или offices, но если бы внутри company было сразу два их, то валидация бы не проходила. Так же можно заметить, что в employee есть слово EMPTY – это значит, что элемент должен быть пустым. Есть еще ANY – любые элементы. #PCDATA – текстовые данные. <b>ATTLIST </b> Служит для добавления атрибутов к элементам. После ATTLIST следует название нужного элемента, а после словарь вида «название атрибута – тип атрибута», а в конце можно добавить #IMPLIED (не обязателен) или #REQUIRED (обязателен). CDATA – текстовые данные. Есть и другие типы, однако все они строчные. <b>ENTITY </b> ENTITY служит для объявления сокращений и текста, который будет на них подстваляться. По сути, мы просто сможем использовать в XML вместо полного текста просто название сущности со знаком & перед и; после. Например: чтобы отличать разметку в HTML и просто символы, левую угловую скобочку часто экранируют с помощью lt; , только нужно еще выставить & перед lt. Тогда мы будем использовать не разметку, а просто символ < . Как вы можете видеть, все довольно просто: объявляете элементы, объясняете, какие элементы объявленные элементы способны содержать, добавление атрибутов этим элементам и, по желанию, можете добавить сущности, чтобы сокращать какие-то записи. И тут вы должны были бы спросить: а как использовать наши правила в нашем XML файле? Ведь мы просто объявили правила, но мы не использовали их в XML. <b>Есть два способа использовать их в XML: </b> <i>1. Внедрение - написание DTD правил внутри самого XML файла, достаточно просто написать корневой элемент после ключевого слова DOCTYPE и заключить наш DTD файл внутри квадратных скобочек. </i> < ? xml version= "1.0" encoding= "UTF-8" ? > < ! DOCTYPE company [ < ! -- Объявление возможных элементов -- > < ! ELEMENT employee EMPTY> < ! ELEMENT employees (employee+ ) > < ! ELEMENT office (employees) > < ! ELEMENT offices (office+ ) > < ! ELEMENT name (#PCDATA) > < ! ELEMENT company (name, offices) > < ! -- Добавление атрибутов для элементов employee и office -- > < ! ATTLIST employee name CDATA #REQUIRED job CDATA #REQUIRED > < ! ATTLIST office floor CDATA #REQUIRED room CDATA #REQUIRED > < ! -- Добавление сущностей -- > < ! ENTITY M "Maksim" > < ! ENTITY I "Ivan" > < ! ENTITY F "Franklin" > ] > <span>< company> </span> <span>< name> </span>IT- Heaven< / name> < ! -- Иван недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка. -- > <span>< offices> </span> < office floor= "1" room= "1" > <span>< employees> </span> < employee name= "&M;" job= "Middle Software Developer" / > < employee name= "&I;" job= "Junior Software Developer" / > < employee name= "&F;" job= "Junior Software Developer" / > < / employees> < / office> < office floor= "1" room= "2" > <span>< employees> </span> < employee name= "Herald" job= "Middle Software Developer" / > < employee name= "Adam" job= "Middle Software Developer" / > < employee name= "Leroy" job= "Junior Software Developer" / > < / employees> < / office> < / offices> < / company> <i>2. Импорт - мы записываем все наши правила в отдельный DTD файл, после чего в XML файле используем DOCTYPE-конструкцию из первого способа, только вместо квадратных скобочек нужно написать SYSTEM и указать абсолютный или относительный до текущего местоположения файла путь. </i> < ? xml version= "1.0" encoding= "UTF-8" ? > < ! DOCTYPE company SYSTEM "dtd_example1.dtd" > <span>< company> </span> <span>< name> </span>IT- Heaven< / name> < ! -- Иван недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка. -- > <span>< offices> </span> < office floor= "1" room= "1" > <span>< employees> </span> < employee name= "&M;" job= "Middle Software Developer" / > < employee name= "&I;" job= "Junior Software Developer" / > < employee name= "&F;" job= "Junior Software Developer" / > < / employees> < / office> < office floor= "1" room= "2" > <span>< employees> </span> < employee name= "Herald" job= "Middle Software Developer" / > < employee name= "Adam" job= "Middle Software Developer" / > < employee name= "Leroy" job= "Junior Software Developer" / > < / employees> < / office> < / offices> < / company> Так же можно использовать ключевое слово PUBLIC вместо SYSTEM, однако оно вряд ли вам пригодится. Если интересно, то почитать про него (и про SYSTEM тоже) можно подробно тут: ссылочка . Теперь мы не можем использовать другие элементы без их объявления в DTD, а весь XML подчиняется нашим правилам. Можете попробовать записать данный код в IntelliJ IDEA в отдельный файл с расширением.xml и попробовать добавить какие-то новые элементы или удалить элемент из нашего DTD и заметите, как IDE будет указывать вам на ошибку. Однако, у DTD есть свои минусы: <ul><li>У него свой собственный синтаксис, отличный от синтаксиса xml.</li> <li>В DTD нет проверки типов данных, а содержать он может только строки.</li> <li>В DTD нет пространства имён.</li> </ul>О проблеме собственного синтаксиса: вы должны разбираться в двух синтаксисах сразу: в XML и в DTD синтаксисе. Они разные и это может заставлять вас путаться. Так же, из-за этого же сложней отслеживать ошибки в огромных XML файлах в соединении с такими же DTD схемами. Если у вас что-то не заработало, приходится проверять огромное количество текста разных синтаксисов. Это как читать одновременно две книжки: на русском и английском. И если знание у одного языка у вас хуже, то понимать текст будет так же сложней. О проблеме проверки типов данных: у атрибутов в DTD действительно есть разные типы, но все они, по сути своей, являются строковыми представлениями чего-либо, списками или ссылками. Однако, вы не можете требовать только числа, и, тем более, позитивные или негативные. А про объектные типы можете вообще забыть. Последняя проблема будет обсуждаться уже в следующей статье, которая будет посвящена пространствам имён и XML схемам, так как обсуждение её тут бессмысленно. Спасибо всем за внимание, я проделал большую работу и продолжаю её проделывать, чтобы вовремя закончить весь цикл статей. По сути, мне осталось разобраться с XML схемами и придумать их объяснение более ясными словами, чтобы закончить 2-ю статью. Её половина уже сделана, так что можете ожидать её в ближайшее время. Последняя статья будет полностью посвящена работе с XML файлами средствами Java. Удачи всем и успехов в программировании:) Следующая статья: <p>Как я сказал в разделе об , данная технология является изыском, который нужен далеко не каждому, но освоив который Вы себя можете смело называться настоящим профессионалом не только по созданию сайта, но и <b>Web-программированию </b>, в первую очередь.</p><p>Только вот путь этот будет крайне тернистым. И на данном сайте находится только лишь часть информации об этой технологии. В частности, рассмотрены возможности по созданию, управлению и <b>парсингу XML-документа </b> в <b>PHP </b>.</p><p>А в основе общения с <b>XML-документом </b> лежит <b>стандарт DOM </b> (<i>Document Object Model </i>), который лежит в основе работы с документами <b>XML </b>. Данный стандарт присутствует не только в <b>PHP </b>, но и во всех языках, которые понимают этот формат (<b>Java </b>, <b>C++ </b>, <b>JavaScript </b> и другие).</p><p>И вот со стандартом <b>DOM </b> нам и предстоит познакомиться в данной категории. Рассматривать этот стандарт мы будем в <b>PHP </b>. Хотя <b>DOM-стандарт </b>, потому и называется "стандартом", что принципы работы остаются и при переходе на другие языки, так что проблем с <b>XML-документами </b> в других языках не будет.</p><p>А теперь приступаем к изучению этой сложной, но, несомненно, важной технологии.</p><h3>Прочитав статьи по основам XML, Вы узнаете:</h3><p>1) Зачем нужен <b>XML </b>.</p><p>2) Структуру <b>XML-документа </b>.</p><p>3) Как сделать <b>RSS-канал </b> на сайте.</p><p>4) Как сделать <b>партнерский-магазин </b> на базе <b>XML </b>-фида.</p><p>5) Как сделать <b>XML </b> парсер строк.</p> <p>Сегодня приступим к рассмотрению очень популярного и удобного <b>языка разметки XML </b>. Так как данный формат представления данных очень гибок и универсален, и его можно использовать практически везде, имеется в виду совестно с чем-то. Поэтому начинающему программисту рано или поздно придется столкнуться с этим языком, и неважно чем конкретно Вы занимаетесь, будь-то web-программированием или администрированием баз данных, потому что XML используют все, и Вы его также будете использовать в реализации нужных Вам задач.</p> <p>Начинать будем как обычно с теории, давайте рассмотрим, что же это за язык, чем он хорош, как им пользоваться и где его используют.</p> <h2>Определение языка XML</h2> <p><b>XML </b> (<i>eXtensible Markup Language </i>) – универсальный и расширяемый язык разметки данных, который не зависит от операционной системы и среды обработки. Xml служит для представления неких данных в виде структуры, и эту структуру Вы можете сами разработать или подстроить под ту или иную программу или какой-то сервис. Именно поэтому данный язык называют расширяемый, и в этом является его главное достоинство, за которое его так ценят.</p> <p>Как Вы знаете, языков разметки существует достаточно много, например, язык HTML , но все они, так или иначе, зависят от обработчика, например, тот же самый html, код которого парсит браузер, является стандартизированным и не расширяемым, там есть четкие теги, синтаксис который нельзя нарушать, а в xml Вы можете сами создавать свои теги, т.е. свою разметку. Главным отличием HTML и XML является то, что html всего лишь описывает разметку для отображения данных, а xml - это абстрактная структура данных, которую можно обработать и отобразить как угодно и где угодно и поэтому сравнивать эти языки не нужно, у них абсолютно разное назначение.</p> <p>Как уже отметилось выше xml очень распространенный и универсальный язык, посредствам которого практически все приложения, как web, так и просто для компьютера используют его в качестве обмена информации, так как с помощью него можно очень легко обмениваться данными между приложениями или сервисами, которые даже написаны на разных языках. В связи с чем, каждый начинающий программист, который занимается абсолютно любым программированием, должен иметь представление об XML. Если Вы хотите стать web мастером, то Вы просто обязаны знать XML, а как стать WEB Мастером и что для этого нужно знать, мы с Вами уже рассматривали.</p> <p>Например, у меня однажды встала задача написать некий сервис, который должен по запросу возвращать данные в виде xml, т.е. своего рода разработать серверную часть приложения, а я даже понятия не имел, на чем написан клиент, который будет обрабатывать эти данные, и что, я написал сервис, который возвращал данные в виде xml и все, приложение работало отлично. И это только пример, с которым мне пришлось столкнуться, а теперь представьте, сколько различных организаций, сотрудничает и совестно разрабатывают программное обеспечение и обмениваются данными, и я не удивлюсь, что эти данные будут в виде xml.</p> <p>Например, у меня однажды была задача написать некий сервис, который должен по запросу возвращать данные в виде xml, т.е. своего рода разработать серверную часть приложения, а я даже понятия не имел, на чем написан клиент, который будет обрабатывать эти данные, и что, я написал сервис, который возвращал данные в виде xml и все, приложение работало отлично. И это только пример, с которым мне пришлось столкнуться, а теперь представьте, сколько различных организаций, сотрудничает и совестно разрабатывают программное обеспечение и обмениваются данными, и я не удивлюсь, что эти данные будут в виде xml.</p> <p>Также мне один раз пришлось хранить данные xml в базе MS SQL 2008, для того чтобы лучше представлять эти самые данные и обмениваться ими между сервером и клиентской частью приложения, это мы рассматривали в статье - Transact-sql – работа с xml .</p> <p>Сам по себе язык XML очень простой, и запутаться в нем просто нельзя, вся сложность возникает именно в обработке и взаимодействие xml с другими приложениями, технологиями, т.е. всем тем, что окружает xml, в чем как раз и можно легко запутаться.</p> <p>Сегодня мы с Вами разговариваем пока только об основах XML, и заострять внимание на технологиях обработки и взаимодействия с этим языком мы не будем, так как это правда, очень объемный материал, но я думаю, в дальнейшем мы продолжим знакомиться с сопутствующими технологиями.</p> <p>Переходим к практике. И все примеры, которые мы будем рассматривать, я буду писать в Notepad++ только потому, что он очень удобен, но сейчас не будем об этом разговаривать, так как мы уже это рассматривали в статье - Чем хорош Notepad++ для начинающего разработчика.</p> <h2>XML теги</h2> <p>Язык XML для разметки использует теги (<i>теги регистрозависимы </i>), но не такие теги как в html, а те, которые Вы придумаете сами, но у xml документа есть также четкая структура, т.е. есть открывающий тег и закрывающий, есть вложенные теги и есть, конечно же, значения, которые расположены в этих тегах. Другими словами, все, что нужно для начальных знаний xml - это просто придерживаться этим правилам. Все вместе открывающий, закрывающий тег и значение называется элементом и весь xml документ состоит именно из элементов, которые в совокупности образуют структуру данных. У xml документа может быть только один корневой элемент, это запомните, так как если Вы напишите два корневых элемента, то это будет ошибка.</p> <p>И пришло время привести пример xml разметки, и первый пример пока для синтаксиса:</p><p> <Начало элемента> <Начало вложенного элемента> Значение вложенного элемента </Конец вложенного элемента> </Конец элемента> </p><p>Как видите все довольно просто, и таких вложенных друг в друга элементов может быть очень много.</p> <p>Теперь давайте приведем пример, настоящего xml документа:</p> <p>Как видите, я здесь просто привел пример своего рода каталога книг, но я не объявлял этот документ, т.е. не писал XML декларацию, которая говорит приложению, которое будет обрабатывать эти данные, что здесь расположены данные именно xml и в какой кодировке они представлены. Также можно писать комментарии и атрибуты, так давайте приведем пример такого документа:</p> <p><img src='https://i0.wp.com/info-comp.ru/images/stories/kartinki4/xmldoc_2.jpg' width="100%" loading=lazy></p> <p> <?xml version="1.0" encoding="UTF-8"?> <!--Комментарий к документу XML--> <catalog name="Каталог книг"> <book id= "1"> <name>Книга 1</name> <author>Иван</author> <comment>Просто книга 1</comment> </book> <book id= "2"> <name>Книга 2</name> <author>Сергей</author> <comment>Просто книга 2</comment> </book> <book id= "3"> <name>Книга 3</name> <author>Роман</author> <comment>Просто книга 3</comment> </book> </catalog> </p><p>Где первая строка и есть объявление декларации о том, что это документ XML и его необходимо читать в кодировке UTF-8.</p> <p>Эти данные без обработки будут выглядеть, например, в браузере (Mozilla Firefox) следующим образом:</p> <p><img src='https://i1.wp.com/info-comp.ru/images/stories/kartinki4/xmldoc_3.jpg' width="100%" loading=lazy></p> <p>Надеюсь, Вы понимаете, что здесь catalog - это корневой элемент, который состоит из элементов book, который в свою очередь состоит из элементов name, author и comment, также для примера я задал несколько атрибутов у элемента catalog и у элемента book.</p> <p>Для основ я думаю достаточно, так как если мы будем все глубже и глубже погружаться в XML, и во все технологии, которые связаны с этим языком, то тогда эта статья никогда не закончится. Так что на сегодня это все. Пока!</p> <b>1. Введение </b> <p>Если кто-либо из вас когда-нибудь пытался изучить XML своими силами, Вы возможно встречались со многими сбивающими с толку понятиями, обрушившимися и на меня в свое время. DTD, XML Schema, пространства имен (namespaces), XPath, XPointers, XSL, XSLT, DOM, SAX, SOAP, Все, я сдаюсь. Добавлю лишь, что большинство из этих материалов основано на реализациях, код которых может содержать ошибки. Наверняка существуют миллионы способов реализации и использования XML, но они все могут быть достаточно сложны. А знаете, XML может быть и очень простым. Если мы забудем про DTD, XML Schemas, пространства имен (namespaces), и т.п.<br> Стараясь быстрее обучить вас работе с XML, я буду по возможности игнорировать приличную долю информации, которую вы и так сможете прочитать в соответствующей литературе. И первое что я собираюсь проигнорировать, это пространства имен (namespaces) и схемы (schemas). Вам это может показаться странным, так как большинство книг начинаются именно с объяснения этих понятий, но постарайтесь думать об XML как о средстве решить конкретную задачу, как, например, о молотке. Для того чтобы пользоваться молотком, разве обязательно знать, как построить дом? Что если все что мне нужно, это просто вбить гвоздь чтобы повесить на него картину? То же самое и с XML, он может быть и очень сложным, достаточно универсальным для использования в сотнях, если не в тысячах приложений, и очень простым, если не обращать внимания на некоторые вещи. В этой статье, я буду концентрироваться на решении конкретных проблем с помощью XML.<br> Так в чем же собственно проблема? Давайте предположим, что я хочу описать простой объект, например стакан, используя XML. Зачем я собираюсь использовать XML для этого? Ну, во-первых, это как раз то, для чего и предназначен XML. XML описывает данные. В моем примере, стакан, это и есть данные. В жизни, данными могут быть документы Word, листы электронных таблиц, изображения, книга, запись базы данных, или даже классы C++ или Visual Basic. Во вторых, XML расширяем. XML позволяет мне создавать столько признаков, сколько необходимо для описания данных и эти признаки будут такими, какими я захочу. И, наконец, потому что XML быстро становится стандартом. Если на Марсе есть жизнь, то можете не сомневаться, что они там смогут понять мой XML файл.</p> <p>Какие основные свойства позволяют описать стакан?</p> <p>Как бы то же самое выглядело в формате XML?</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p><?xml version="1.0"?> <CUP> <MATERIAL transparent="yes">glass</MATERIAL> <HEIGHT units="inches">6</HEIGHT> <VOLUME units="ounces">16</VOLUME> <CONTENTS> <SOLID qty="2">ice cube</SOLID> <SOLID qty="1">straw</SOLID> <LIQUID qty="3" units="ounces">water</LIQUID> <OTHER qty="0"/> </CONTENTS> <LID>yes</LID> </CUP></p> </td> </tr></table><p>Заметьте, что первая строка файла (<?xml version="1.0"??>) имеет специальный вид, пока, просто запомните, что она должна быть тут. Прелесть формата XML в том, что любой может понять, о чем в нем говориться, просто внимательней взглянув на него. Понятно также, что это не единственное из возможных XML описаний стакана. Если я попрошу 10 человек разработать XML описание стакана с одинаковыми свойствами, возможно, все они создадут разные, но верные описания. Вот тут как раз и кроется проблема. Возможно не для нас, людей, но когда компьютер читает XML файл, то было бы отличной идеей, дать ему знать, о чем этот файл. Вот тут и всплывает пространство имен (namespaces) и схемы (schemes). Проще говоря, схемы используются для определения адекватной структуры для XML файла.<br> Теперь настало время поговорить о нескольких простых правилах XML, которым необходимо придерживаться:</p> <p><i>Правило XML #1 </i>: Адекватный XML файл должен в точности соответствовать своей схеме. Но для простоты понимания материала, ни один из моих примеров не будет использовать схемы. Таким образом, строго говоря, ни один из моих примеров не "адекватный". Но, честно говоря, мне все равно. Я не собираюсь строить дом, мне нужно всего лишь повесить картину. Я подробней расскажу об этом позже, когда будем обсуждать объектную модель документов XML.</p> <p><i>Правило XML #2 </i>: Если вы программируете на VB, запомните: XML чувствителен к регистру. XML чувствителен к регистру. XML чувствителен к регистру. XML чувствителен к регистру. Напишите это предложение 1000 раз и никогда не забудете.</p> <p><i>Правило XML #3 </i>: Тэги принято называть элементами и каждый открывающийся тэг, должен иметь соответствующий ему закрывающийся тэг. Следуя этому правилу, у вас получится правильный XML файл. Это очень важно, потому что до тех пор, пока XML файл не будет правильно оформлен, он не будет проанализирован и не загрузится в объектную модель документов. Заметьте, если элемент не содержит значений и не содержит других (вложенных) элементов, закрывающий тэг может иметь вид <Element /> вместо более громоздкой конструкции <Element></Element>. Можете увидеть такой подход в предыдущем примере (<OTHER qty="0"/>).</p> <p><i>Правило XML #4 </i>: Элементы могут содержать атрибуты, а значения атрибутов должны быть заключены в кавычки (одинарные или двойные).</p> <p><i>Правило XML #5 </i>: Можно несколько раз использовать имена атрибутов, но имена элементов должны быть уникальны для всего файла. В предыдущем примере, атрибут qty имел различное значение в зависимости от того, в каком элементе он используется <SOLID>,<LIQUID>, или <OTHER>. Значение атрибута зависит от контекста его использования. Тогда как значение элемента всегда означает одно и то же, независимо от того, в каком месте файла атрибут находится. В предыдущем примере, элемент <SOLID> и <HEIGHT> всегда имеет одно и то же значение во всем нашем документе. <HEIGHT> например, всегда используется для описания высоты стакана.</p> <p><i>Правило XML #6 </i>: В XML есть несколько специальных символов, которые не могут быть использованы напрямую, потому что являются зарезервированными в синтаксисе XML. Поэтому, для использования таких символов, придется использовать зарезервированную конструкцию, начинающуюся с символа & и специального кода, (символ & должен писаться как &) (символ " должен писаться как ") (символ < должен писаться как <) (символ > должен писаться как >) и (символ " должен писаться как "). Вместо этого, также можно использовать инструкцию <!]>, где на месте "...." может быть любая последовательность символов, кроме "]]>". Такая конструкция может встречаться в любом месте, но она не может быть вложенной.</p> <p> <b>2. Объектная модель документов XML </b> </p> <p>Объектная модель документов XML позволяет программистам загружать содержимое XML файла в память. Как только XML файл загружен таким образом, с ним можно работать, используя свойства, методы и события объектной модели документов. Вот где как раз и проявляется польза XML. Объектная модель документов значительно облегчает выборку и обработку информации XML файла. Я не буду тут рассказывать обо всех возможностях объектной модели документов, расскажу лишь о некоторых основных возможностях, которые помогут в достижении цели этой статьи. Я возьму только что созданный XML файл с описанием стакана, загружу его в объектную модель документов и проделаю несколько действий с ним. Остальные особенности и возможности объектной модели документов я приберегу для следующей статьи, рассказывающей о клиентском XML. Заметьте, не смотря на то, что объектная модель документов очень хороша и удобна для разработчиков, она требует довольно значительного объема системных ресурсов. Поэтому существует еще один метод анализа XML файлов, известный как SAX. Моя статья не претендует на исчерпывающий источник информации по этому вопросу, поэтому было бы полезно также воспользоваться XML SDK.</p> <p>Давайте посмотрим на пример, используя анализатор Microsoft"s XML версии 3.0 (Microsoft"s XML parser version 3.0 (msxml3.dll)) чтобы разобраться, как же это все работает. Если у вас нет анализатора, то последнюю версию можно скачать с сайта Microsoft.<br> Предположим, я сохранил пример описания стакана в формате XML в файл "http://web_server/xml/cup.xml" (локальный путь C:\inetpub\wwwroot\xml\cup.xml) и теперь хочу загрузить его в объектную модель документов. Следующий код предполагает, что анализатор уже загружен и работает.</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p><b>Код на Visual Basic 6.0: </b> (устанавливаем связь с Microsoft XML, v3.0) Dim xmlDoc as MSXML2.DOMDocument30 Set xmlDoc = New DOMDocument30 xmlDoc.async = False xmlDoc.validateOnParse = False xmlDoc.load ("c:\inetpub\wwwroot\xml\cup.xml") msgBox xmlDoc.xml <b>ASP Server-Side код на Visual Basic: </b> Dim xmlDoc Set xmlDoc = Server.CreateObject("Msxml2.DOMDocument.3.0") xmlDoc.async = False xmlDoc.validateOnParse = False xmlDoc.load "/xml/cup.xml" <b>ASP Server-Side код на Java Script: </b> var xmlDoc = Server.CreateObject("Msxml2.DOMDocument.3.0"); xmlDoc.async = false; xmlDoc.validateOnParse = false; xmlDoc.load ("/xml/cup.xml");</p> </td> </tr></table><p>Пояснение приведённого кода - пройдемся по коду на VB6</p> <p><i>Строка 1: </i> Dim xmlDoc as MSXML2.DOMDocument30</p> <p>В этой первой строке определяем ссылку на "Microsoft XML, v3.0". В этой строке я определил переменную xmlDoc как ссылку на XML документ. MSXML2 это библиотека (используйте это название, не пытайтесь написать MSXML3, это не будет работать). DOMDocument30 определяет объект XML документа соответствующий версии 3.0. Вы также можете встретить такой код: dim xmlDoc as MSXML2.DOMDocument. Такой конструкцией обычно пользуются, когда не хотят указывать конкретную версию XML документа. В этом случае будет использоваться зарегистрированный по умолчанию в системе анализатор. Проблема может быть только в том, что версия анализатора, зарегистрированная по умолчанию, может отличаться на разных компьютерах. Если вы хотите быть уверенными в том, что написанный вами код будет работать с любой версией анализатора, то не используйте в нем специфических для конкретных версий анализатора конструкций. Потому, что нет никакой гарантии, что у пользователя, который будет пользоваться вашим кодом, установлена имена та версия анализатора, под которую вы писали свой код. Еще одно преимущество разработки кода, независимого от версии анализатора в том, что когда выходит более новая версия анализатора, у нее обязательно будет обратная совместимость с предыдущими версиями, и вам не придется перекомпилировать ваш код.</p> <p><i>Строка 2: </i> Set xmlDoc = new DOMDocument30</p> <p>В этой строке происходит инициализация переменной xmlDoc как нового экземпляра объекта XML документа версии 3.0.</p> <p><i>Строка 3: </i> xmlDoc.async = False</p> <p>Файлы XML могут быть загружены либо в синхронном, либо в асинхронном режиме. Если xmlDoc.async = False, то значит, что содержимое XML фала будет загружено, и только после этого управление будет передано вызывающему процессу. Если xmlDoc.async = True, то значит, что управление будет передано вызывающему процессу сразу, не дожидаясь, пока содержимое XML файла будет полностью загружено.</p> <p><i>Строка 4: </i> xmlDoc.validateOnParse = False</p> <p>Этот код сообщает о том, что анализатор не должен проверять загружаемый XML файл на соответствие своей схеме (validateOnParse = False). Для того, чтобы включить проверку на соответствие схемы, нужно написать validateOnParse = True.</p> <p><i>Строка 5: </i> xmlDoc.load ("C:\inetpub\wwwroot\xml\cup.xml")</p> <p>В этой строке вызывается метод загрузки указанного XML файла. Существует два вида метода загрузки. Первый, который написан в строке 5, загружает файл в объектную модель документов, и при этом нужно обязательно передавать полный путь до XML файла. Второй вариант загрузки предусматривает передачу в качестве параметра xml строку. Такой вид загрузки мог бы быть вызван, например, так: xmlDoc.loadXML("корректная xml строка"). Я покажу, как пользоваться этим способом позже.</p> <p><i>Строка 6: </i> MsgBox xmlDoc.xml</p> <p>Эта строка отображает содержимое загруженного XML файла. В результате мы должны получить тот исходный XML файл, который создали ранее.</p> <p> <b>2.2. Исследование объектной модели документов XML </b> </p> <p>Создайте в Visual Basic новый проект и назовите его standard.exe. Вставьте приведенный выше код в метод загрузки главного окна вашего проекта. Убедитесь, что вы объявили ссылку именно на "Microsoft XML v3.0". Для того, чтобы это сделать, нажмите Project-->References, затем пролистайте появившийся список вниз и найдите в нем нужную ссылку. Заметьте, анализатор версии 3.0 должен быть установлен на вашем компьютере, иначе в списке его не будет. Установите точки остановки на последней строке кода (msgbox xmlDoc.xml). Запустите приложение в режиме отладки. Когда процесс выполнения дойдет до точки остановки, вызовите окно "Locals" и посмотрите объектную модель документов. Можно многое узнать, просматривая то, что отображено в этом окне. Окно "Locals" должно быть похоже на то, что изображено на рисунке ниже. Вот некоторые интересные свойства объектной модели документов.</p> <p>Объектная модель документов XML всегда содержит два узла верхнего уровня:</p> <ul><li>Item1 это корень ветви элементов документа (не обращайте на нее внимания)</li> <li>Item2 на самом деле первый элемент документа (запомните это)</li> </ul><p>nodeName или baseName - могут быть использованы при поиске имени элемента или атрибута.<br> nodeType - используйте для того, чтобы получить тип текущего узла.<br> nodeValue - используете для того, чтобы узнать значение данных узла.<br> childNodes - это коллекция узлов-потомков. Они могут быть узлами элементов, текстовыми узлами и узлами CDATA. Могут быть и другие типы узлов, про которые я сейчас рассказывать не стану, но вы сможете узнать все про них в XML SDK.<br> attributes - это коллекция узлов атрибутов текущего элемента.<br> length - используется для определения количества узлов в дереве непосредственно принадлежащих текущему.<br> xml - это свойство присутствует во всех узлах и может быть использовано для представления текущей позиции в документе. XML строка начинается с текущего узла и проходит вниз до конца дерева. Это очень полезное свойство. Поэкспериментируете с ним и увидите, что получится.</p> <p> <b>2.2.2. Узлы элементов </b> </p> <p>Узел элементов может содержать узлы потомки элементов, атрибутов, текста или CDATA. Из рисунка ниже видна следующая информация об узле "SOLID":</p> <p>nodeType - Тип текущего узла = NODE_ELEMENT - т.е. текущий узел является элементом.<br> nodeName или baseName или tagName - Название текущего узла (элемента) = SOLID.<br> Его родительский элемент CONTENTS имеет 4 потомков.<br> Это можно увидеть на следующем рисунке, но SOLID имеет одного потомка, который имеет текстовый тип данных.<br> text - "ice cube" это сокращенный метод, позволяющий получить значение текущего узла без перемещения к текстовому узлу потомка.</p> <p><img src='https://i2.wp.com/sql.ru/subscribe/2003/166_2.gif' width="100%" loading=lazy></p> <p> <b>2.2.3. Узлы атрибутов </b> </p> <p>Узлы атрибутов могут состоять только из текстовых или CDATA узлов-потомков. На следующем рисунке показано, какая информация может быть получена об узле "qty":</p> <p>nodeType - Тип текущего узла = NODE_ATTRIBUTE - текущий узел является атрибутом.<br> nodeName или baseName - Имя текущего узла (Атрибутов) = qty</p> <p>Из следующего рисунка также понятно, что qty имеет одного потомка, который имеет текстовый тип данных.<br> text или value - "2" это сокращенный метод, позволяющий получить значение текущего узла без перемещения к текстовому узлу потомка.</p> <p><img src='https://i2.wp.com/sql.ru/subscribe/2003/166_3.gif' height="562" width="424" loading=lazy></p> <p> <b>2.2.4. Текстовые узлы и узлы CDATA </b> </p> <p>Текстовые или CDATA узлы не содержат потомков. Текстовые узлы содержат обработанные текстовые данные своего родительского узла. CDATA содержат необработанные текстовые данные своего родительского узла. CDATA узлы создаются, когда данные в XML файле специальным образом обрамлены. Метка CDATA говорит анализатору не разбирать данные и принимать символы внутри этой метки как данные. Секция CDATA особенно полезна, когда нужно вставить код внутрь XML файла. На следующем рисунке показано, какая информация может быть получена из текущего текстового узла:</p> <p>nodeType - Тип текущего узла = NODE_TEXT - текущий узел содержит текстовые данные.<br> nodeName - Имя текущего узла (текстового) = #text - все текстовые узлы называются #text<br> data или text или value - "2" - это текущие данные узла.</p> <p><img src='https://i2.wp.com/sql.ru/subscribe/2003/166_4.gif' height="548" width="363" loading=lazy></p> <p> <b>2.2.5. Ошибки при загрузке документа </b> </p> <p>Секция parseError объектной модели документов может оказаться полезно при выявлении проблем, возникающих при загрузке XML документа. Если я удалю закрывающий тег от OTHER в файле нашего примера и попытаюсь запустить программу еще раз, то получу следующий результат. Первая часть полезной информации, это то, что наш nextSibling теперь содержит значение Nothing. Теперь, если вы посмотрите на childNodes, вы можете увидеть, что поле length теперь равно 0. Оба этих признака говорят о том, что наш XML документ не был загружен. Чтобы разобраться почему, я открываю узел parseError и получаю всю информацию об ошибках.</p> <p><img src='https://i1.wp.com/sql.ru/subscribe/2003/166_5.gif' height="561" width="555" loading=lazy></p> <p>Итак, я показал вам, как загрузить XML файл в объектную модель документов, но что с ним там делать? Одна из основных возможностей, которой вы сможете пользоваться это выполнять различные запросы к XML документу. Для этого вы конечно можете просматривать весь документ до тех пор, пока не найдете информацию которую ищите. Но наиболее предпочтительный способ, это использование одного из двух методов класса DOMDocument. Два метода используемые для поиска узлов в нашем предыдущем примере могли бы выглядеть как xmlDoc.SelectSingleNode(patternString) - для получения искомого узла, или xmlDoc.SelectNodes(patternString) - для получения списка искомых узлов. Параметр patternString как раз и является запросом. Он может быть сформирован одним из двух способов. Либо как XSL запрос, либо как XPath запрос. Более новый и предпочтительный способ создавать запросы к XML документу, это XPath. Формат patternString должен быть установлен заранее, перед первым вызовом любого из двух методов запроса данных, иначе по умолчанию будет использоваться XSL способ формирования запросов. Для установки типа формирования patternString используйте setProperty("SelectionLanguage", "format"). Для того, чтобы изменить запросы в нашем примере таким образом, чтобы использовался способ XPath, я добавлю следующую команду: setProperty("SelectionLanguage","XPath"). По-моему, XPath это самая важная технология в XML которую следует изучить. Я приведу несколько простых XPath запросов. Хорошим началом для изучения этой технологии может служить Microsoft XML SDK. Еще одним способом для объяснения этого, могло бы быть написание простого приложения на Visual Basic, которое позволяет вводить запросы и выводить результат. Вы, возможно, найдете какие-нибудь бесплатные приложения, которые делают то же самое, но XPath довольно новый и может не вполне поддерживаться этими приложениями.</p> <p> <b>2.3.1. Использование XPATH для выполнения запросов к объектной модели документов </b> </p> <p>Давайте добавим некоторый код в конец нашего предыдущего примера для того, чтобы возвратить содержимое нашего стакана:</p> <p>ОТЛИЧНО! Давайте теперь добавим еще один запрос, который позволит нам определить, есть ли у стакана крышка или нет. Добавьте следующий код в конец предыдущего:</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p>Set objNode = xmlDoc.selectSingleNode("/CUP/LID") if objNode.text="yes" then MsgBox "We have a lid" else MsgBox "No lid on this cup" end if</p> </td> </tr></table><p>Пройдемся по коду строка за строкой:</p> <p><i>Строка 1 </i>: Dim objNode As IXMLDOMNode</p> <p>В этой строке определяется переменная objNode типа узел XML документа. Важно понимать, что узел XML документа это тоже объект. Это не значение. Он состоит сам из себя, также как и его атрибуты и потомку (childNodes). Этим способом вы можете отсекать ненужные ветви дерева, выбирая только нужные.</p> <p><i>Строка 2 </i>: Dim objListOfNodes As IXMLDOMNodeList</p> <p>В этой строке определяется переменная objListOfNodes имеющая тип списка узлов XML документа (группы узлов).</p> <p><i>Строка 3 </i>: xmlDoc.setProperty "SelectionLanguage", "XPath"</p> <p>Эта строка устанавливает способ формирования patternString как XPath.</p> <p><i>Строка 4 </i>: MsgBox "Your cup contains the following items:"</p> <p><i>Строка 5 </i>: Set objListOfNodes = xmlDoc.selectNodes("//CONTENTS/*[@qty>0]")</p> <p>Эта строка выполняет XPath запрос, который вернет группу узлов и сохранит их в переменной objListOfNodes. Запрос разбит на следующие части:</p><ul><li>//CONTENTS - взять все элементы CONTENTS в XML документе. Заметьте: // - это краткое обозначение для всего содержимого XML документа.</li> <li>/* - из списка элементов CONTENTS взять все (* - используется для указания всех) элементы-потомки. Это сокращает полученный результат до четырех узлов элементов (<SOLID><SOLID><LIQUID><OTHER>). Эти четыре узла попадают напрямую под узел CONTENTS.</li> <li>[@qty>0] - проверить каждый элемент-потомок на то, чтобы его атрибут qty (@ - означает атрибут) был больше 0. Если это условие не выполняется, узел отбрасывается. Все, что внутри в XPath запросе может принимать значения True или False. Если результат True, то узел сохраняется. Если результат False, то узел отбрасывается. После этого наш результат сокращается до трех узлов (<SOLID><SOLID> </ul><p><i>Строка 6-8 </i>: For Each objNode In objListOfNodes / MsgBox objNode.Text / Next</p> <p>Эти строки отображают значения каждого узла элемента, которые соответствуют запросу. ("ice cube" , "straw" , "water").</p> <p><i>Строка 9 </i>: Set objNode = xmlDoc.selectSingleNode("/CUP/LID")</p> <p>Эта строка возвращает все элементы LID, которые принадлежат элементу CUP, который, в свою очередь, порожден от корня дерева (когда запрос начинается с /, то это означает что начинать нужно с корня). Это очень похоже на путь к файлу или папке. В нашем примере, этот запрос вернет элемент LID, который содержит значение "yes". Важно тут то, что я указал запросу начинать с корневого элемента XML документа. Запросы не всегда начинают выполняться с корневых элементов, обычно они начинаются с текущего узла. В нашем примере это не имеет значения, поскольку текущим узлом (xmlDoc) и является корневой элемент XML документа (но не во всех случаях это так).</p> <p><i>Строка 10-15 </i>: if objNode.text="yes" then / MsgBox "We have a lid" /<br> else / MsgBox "No lid on this cup" /end if</p> <p>Эта строка отображает сообщение "We have a lid" потому, что текстовое свойство элемента LID "yes".</p> <p> <b>3. Преобразование ADO в XML </b> </p> <p>Теперь, когда вы поняли основы XML, давайте создадим элемент управления ActiveX, который будет конвертировать набор данных ADO в XML формат. Цель в том, чтобы получить наименования книг из таблицы Titles базы данных Pubs и вернуть их в формате XML. Результат, который получится я буду использовать в своей следующей статье. Вы можете сказать, ADO имеет свои собственные методы для сохранения результата в формате XML, правильно? Да, но если доверить это ADO, то в итоге я получу XML файл в таком ужасном формате, что с ним невозможно будет работать. ADO создаст XML файл с использованием пространства имен, а мне сейчас это совсем не нужно. Во-вторых, ADO создаст XML файл, который будет представлен в форме атрибутов. Иными словами, каждая запись станет элементом и каждое поле - атрибутом:</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p><xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly"> <s:AttributeType name="title_id" rs:number="1" rs:writeunknown="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="6" rs:maybenull="false"/> </s:AttributeType> <s:AttributeType name="title" rs:number="2" rs:writeunknown="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="80" rs:maybenull="false"/> </s:AttributeType> <s:AttributeType name="type" rs:number="3" rs:writeunknown="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="12" rs:fixedlength="true" rs:maybenull="false"/> </s:AttributeType> <s:AttributeType name="price" rs:number="4" rs:nullable="true" rs:writeunknown="true"> <s:datatype dt:type="number" rs:dbtype="currency" dt:maxLength="8" rs:precision="19" rs:fixedlength="true"/> </s:AttributeType> <s:AttributeType name="ytd_sales" rs:number="5" rs:nullable="true" rs:writeunknown="true"> <s:datatype dt:type="int" dt:maxLength="4" rs:precision="10" rs:fixedlength="true"/> </s:AttributeType> <s:AttributeType name="notes" rs:number="6" rs:nullable="true" rs:writeunknown="true"> <s:datatype dt:type="string" rs:dbtype="str" dt:maxLength="200"/> </s:AttributeType> <s:AttributeType name="pubdate" rs:number="7" rs:writeunknown="true"> <s:datatype dt:type="dateTime" rs:dbtype="timestamp" dt:maxLength="16" rs:scale="3" rs:precision="23" rs:fixedlength="true" rs:maybenull="false"/> </s:AttributeType> <s:extends type="rs:rowbase"/> </s:ElementType> </s:Schema> <rs:data> <z:row title_id="BU1032" title="The Busy Executive"s Database Guide" type="business " price="19.99" ytd_sales="4095" notes="An overview of available database systems with emphasis on common business applications. Illustrated." pubdate="1991-06-12T00:00:00"/> <z:row title_id="BU1111" title="Cooking with Computers: Surreptitious Balance Sheets" type="business " price="11.95" ytd_sales="3876" notes="Helpful hints on how to use your electronic resources to the best advantage." pubdate="1991-06-09T00:00:00"/> </rs:data> </xml></p> </td> </tr></table><p>А мне бы хотелось получить XML файл в форме элементов, где каждая запись, содержалась бы в теге <BOOK>, и каждое поле было бы элементом внутри тега <BOOK>. Синтаксис моей XML строки был бы таким:</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p><TITLES> <BOOK>data from table <FIELD prettyname="Book identification number" tablename="titles" columnname="title_id" datatype="number" filter="">data from table</FIELD> <FIELD prettyname="Title of the book" tablename="titles" columnname="title" datatype="text" filter="">data from table</FIELD> <FIELD prettyname="Type of book" tablename="titles" columnname="type" datatype="text" filter="">data from table</FIELD> <FIELD prettyname="Price of the book" tablename="titles" columnname="price" datatype="number" filter="">data from table</FIELD> <FIELD prettyname="Year todate sales" tablename="titles" columnname="ytd_sales" datatype= "number" filter= "">datafrom table</FIELD> <FIELD prettyname="Datepublished" tablename= "titles" columnname="pubdate" datatype="date" filter= "">datafromtable</FIELD> </BOOK> </TITLES></p> </td> </tr></table><p>Кстати, то, что я только что сделал, это создал схему для моей XML строки. Теперь, если мне нужно сверить структуру XML документа со схемой, все что мне останется сделать, это преобразовать схему в правильный формат. То есть в синтаксис DTD или XDR. Заметьте, что я добавил некоторые атрибуты к каждому элементу <FIELD>. Одна из причин этого в том, что эта информация может быть использована клиентом. Prettyname могут быть использованы как метки данных. Атрибут datatype мог бы быть использован для проверки данных на стороне клиента. Но чтобы быть честным, истина причина того, что появились эти атрибуты в том, что они имеют особое назначение в шаблоне XSL фала, который я часто использую для построения секции where SQL запросов. Может быть, я скоро опубликую статью, демонстрирующую этот подход. Шаблон на самом деле очень полезный. Когда XML структура применяется к данным из таблицы Titles, результат будет выглядеть следующим образом:</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p><TITLES> <BOOK>The Busy Executive"s Database Guide <FIELD prettyname="Title Identification Number" tablename="titles" gcolumnname="title_id" datatype="number" gfilter="">BU1032</FIELD> <FIELD prettyname="Title of the Book" tablename="titles" gcolumnname="title" datatype="text" gfilter=""> The Busy Executive"s Database Guide</FIELD> <FIELD prettyname="Type of Book" tablename="titles" gcolumnname="type" datatype="text" gfilter="">business </FIELD> <FIELD prettyname="Price of the Book" tablename="titles" gcolumnname="price" datatype="number" gfilter="">19.99</FIELD> <FIELD prettyname="Year to date sales" tablename="titles" gcolumnname="ytd_sales" datatype="number" gfilter="">4095</FIELD> <FIELD prettyname="Notes about the book" tablename="titles" gcolumnname="notes" datatype="memo" gfilter=""> An overview of available database systems with emphasis on common business applications. Illustrated.</FIELD> <FIELD prettyname="Date Published" tablename="titles" gcolumnname="pubdate" datatype="date" gfilter="">6/12/1991</FIELD> </BOOK> <BOOK>Cooking with Computers: Surreptitious Balance Sheets <FIELD prettyname="Title Identification Number" tablename="titles" gcolumnname="title_id" datatype="number" gfilter="">BU1111</FIELD> <FIELD prettyname="Title of the Book" tablename="titles" gcolumnname="title" datatype="text" gfilter="">Cooking with Computers: Surreptitious Balance Sheets</FIELD> <FIELD prettyname="Type of Book" tablename="titles" gcolumnname="type" datatype="text" gfilter="">business </FIELD> <FIELD prettyname="Price of the Book" tablename="titles" gcolumnname="price" datatype="number" gfilter="">11.95</FIELD> <FIELD prettyname="Year to date sales" tablename="titles" gcolumnname="ytd_sales" datatype="number" gfilter="">3876</FIELD> <FIELD prettyname="Notes about the book" tablename="titles" gcolumnname="notes" datatype="memo" gfilter="">Helpful hints on how to use your electronic resources to the best advantage.</FIELD> <FIELD prettyname="Date Published" tablename="titles" gcolumnname="pubdate" datatype="date" gfilter="">6/9/1991</FIELD> </BOOK> </TITLES></p> </td> </tr></table><p>Теперь я получил что-то, с чем можно работать!</p> <p>Листинг 1 - CUP.XML</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p><?xml version="1.0"?> <CUP> <MATERIAL transparent="yes">glass</MATERIAL> <HEIGHT units="inches">6</HEIGHT> <VOLUME units="ounces">16</VOLUME> <CONTENTS> <SOLID qty="2">ice cube</SOLID> <SOLID qty="1">straw</SOLID> <LIQUID qty="3" units="ounces">water</LIQUID> <OTHER qty="0"/> </CONTENTS> <LID>yes</LID> </CUP></p> </td> </tr></table><table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p>Dim xmlDoc As MSXML2.DOMDocument30 Set xmlDoc = New DOMDocument30 xmlDoc.async = False xmlDoc.validateOnParse = False xmlDoc.Load ("c:\inetpub\wwwroot\xml\cup.xml") MsgBox xmlDoc.xml Dim objNode As IXMLDOMNode Dim objListOfNodes As IXMLDOMNodeList xmlDoc.setProperty "SelectionLanguage", "XPath" MsgBox "Your cup contains the following items" Set objListOfNodes = xmlDoc.selectNodes("//CONTENTS/*[@qty>0]") For Each objNode In objListOfNodes MsgBox objNode.Text Next Set objNode = xmlDoc.selectSingleNode("/CUP/LID") If objNode.Text = "yes" Then MsgBox "We have a lid" Else MsgBox "No lid on this cup" End If</p> </td> </tr></table><p>Листинг 3 - Элемент управления ActiveX: ADO в XML (WebClass.dll)(xmlControl.cls)</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p>Option Explicit "Declare Database variables Private m_dbConnection As New ADODB.Connection Private m_dbCommand As ADODB.Command Private m_adoRs As ADODB.Recordset Private m_adoErrors As ADODB.Errors Private m_adoErr As Error Public nCommandTimeOut As Variant Public nConnectionTimeOut As Variant Public strConnect As Variant Public strAppName As String Public strLogPath As String Public strDatabase As String Public strUser As String Public strPassword As String Public strServer As String Public strVersion As String Public lMSADO As Boolean "Private Global Variables Private gnErrNum As Variant Private gstrErrDesc As Variant Private gstrErrSrc As Variant Private gstrDB As String Private gstrADOError As String Private Const adLeonNoRecordset As Integer = 129 Private gtableName(6) As String Private gcolumnName(6) As String Private gprettyName(6) As String Private gdatatype(6) As String Private gfilter(6) As String Private Function OpenDatabase() If Len(strConnect) = 0 Then "устанавливаем значения по умолчанию If Len(strDatabase) = 0 Then strDatabase = "pubs" End If If nConnectionTimeOut = 0 Then nConnectionTimeOut = 600 End If If nCommandTimeOut = 0 Then nCommandTimeOut = 600 End If If Len(strAppName) = 0 Then strAppName = "xmlControl" End If If Len(strUser) = 0 Then strUser = "sa" End If If Len(strPassword) = 0 Then strPassword = "" End If strConnect = "Provider=SQLOLEDB.1; " & _ "Application Name=" & strAppName & _ "; Data Source=" & strServer & "; Initial Catalog=" & strDatabase & "; " & _ " User ID=" & strUser & "; Password=" & strPassword & ";" End If "подключаемся к SQL Server и открываем базу данных On Error GoTo SQLErr "Включаем обработчик ошибок With m_dbConnection .ConnectionTimeout = nConnectionTimeOut .CommandTimeout = nCommandTimeOut .Open strConnect "открываем базу данных, используя строку подключения End With On Error GoTo 0 "выключаем обработчик ошибок OpenDatabase = True "база данных открыта успешно Exit Function SQLErr: Call logerror("OPEN") OpenDatabase = False End Function Private Function BuildSQLwhere(tmpWhere) As String "Это на будущее End Function Public Function GetTitlesXML(Optional xmlWhere As Variant) As String Dim whereClause As String Dim strSQL As String Call OpenDatabase "открываем базу данных pubs If IsMissing(xmlWhere) Then "когда запрос не прошел whereClause = "" Else whereClause = BuildSQLwhere(xmlWhere)"конвертируем запрос в правильный sql End If "инициализируем sql выражение которое будет запрашивать заголовки книг strSQL = "select title_id,title,type,price,ytd_sales,notes,pubdate from titles " & whereClause Call NewRecordSet "создаем набор данных "устанавливаем cursorlocation m_adoRs.CursorLocation = adUseClient "открываем набор записей m_adoRs.Open strSQL, m_dbConnection, adOpenForwardOnly, adLockReadOnly, adCmdText "отключаемся от набора данных Set m_adoRs.ActiveConnection = Nothing On Error GoTo 0 "выключаем обработчик ошибок "закрываем базу данных и освобождаем подключение Call CloseDatabase If m_adoRs.EOF Then GetTitlesXML = "" "запрос не вернул ни одного значения Else If lMSADO Then GetTitlesXML = msado(m_adoRs) "конвертируем набор данных в Microsoftado-->xml Else GetTitlesXML = ADOtoXML(m_adoRs, True) "convert the ado recordset to custom xml End If End If "закрываем набор данных Call CloseRecordset Exit Function SQLErr: Call logerror(strSQL) End Function Private Function ADOtoXML(tmprs As ADODB.Recordset, tmpMP As Boolean) As String Dim adoFields As ADODB.Fields "объявляем коллекцию для хранения полей Dim adoField As ADODB.Field "используется для получения каждого поля из коллекции Dim xmlDoc As msxml2.DOMDocument30 Dim tmpLine As String "хранит xml представление каждой книги Dim tmpXML As String "служит для конкатенации xml строк Dim i As Integer If tmprs.EOF Then "запрос не вернул ни одну запись ADOtoXML = "" Exit Function Else Set adoFields = tmprs.Fields "создаем коллекцию полей End If tmpXML = "<TITLES>" "все книги будет заключены в тег <TITLES> Do Until tmprs.EOF "цикл по каждой строке в наборе данных i = 0 " I - индекс ado поля, который начинается с 0 - первое поле будет field(0) tmpLine = "<BOOK>" & tmprs("title") & vbCrLf For Each adoField In adoFields "цикл по всем полям "строим xml тег <FIELD> и его атрибуты для текущего поля tmpLine = tmpLine & "<FIELD " tmpLine = tmpLine & "prettyname=""" & gprettyName(i) & """ " tmpLine = tmpLine & "tablename=""" & gtableName(i) & """ gcolumnname=""" & adoField.Name & """ " tmpLine = tmpLine & "datatype=""" & gdatatype(i) & """ gfilter=""""" tmpLine = tmpLine & ">" & adoField.Value tmpLine = tmpLine & "</FIELD>" & vbCrLf i = i + 1 "переходим на следующее поле Next tmpXML = tmpXML & tmpLine & "</BOOK>" & vbCrLf "закрывающий тег после последнего поля tmprs.MoveNext "следующий заголовок Loop Set adoField = Nothing "уничтожаем объект-поле Set adoFields = Nothing "уничтожаем объект-коллекцию полей tmpXML= tmpXML & "<?xml version="1.0"?></TITLES>" & vbCrLf "закрывающий тег </TITLES> Set xmlDoc = New msxml2.DOMDocument30 "создание xmlDOM xmlDoc.async = False "ждем когда документ загрузится xmlDoc.validateOnParse = False "не сверяемся со схемой xmlDoc.loadXML(tmpXML) "загружаем строку в объектную модель документов On Error Resume Next "если файл не существует, то обрабатываем эту ошибку Kill("c:\temp\custom.xml") "стираем файл если он существует On Error GoTo 0 "говорим обработчику ошибок прерываться при обнаружении ошибки xmlDoc.save ("c:\temp\custom.xml") "сохраняем xml в файл ADOtoXML=xmlDoc.xml "возвращает xml строку Set xmlDoc=Nothing "уничтожаем объектную модель документов End Function Private Function msado(tmprs As ADODB.Recordset) As String Dim xmlDoc As msxml2.DOMDocument30 On Error Resume Next "если файла не существует, получаем ошибку Kill ("c:\temp\msado.xml") "стираем файл, если он существует On Error GoTo 0 " говорим обработчику ошибок прерываться при обнаружении ошибки tmprs.save "c:\temp\msado.xml", adPersistXML " сохраняем xml в файл Set xmlDoc = New msxml2.DOMDocument30 "создаем объектную модель документов xml xmlDoc.async = False "ждем загрузки xml документа xmlDoc.validateOnParse = False "не сверяемся со схемой xmlDoc.Load ("C:\temp\msado.xml") "загружаем файл в объектную модель документов msado = xmlDoc.xml "возвращаем xml строку Set xmlDoc = Nothing "уничтожаем объектную модель документов End Function Private SubCloseRecordset() "закрываем набор данных m_adoRs.Close Set m_adoRs =Nothing End Sub Private Sub NewRecordSet() Set m_adoRs= Nothing Set m_adoRs=New ADODB.Recordset End Sub Private Sub CloseDatabase() m_dbConnection.Close Set m_dbConnection =Nothing End Sub Private Sub logerror(errSQL As String) Dim hFile As Integer Dim expFile As String On Error GoTo 0 gnErrNum = Err.Number gstrErrDesc =Err.Description gstrErrSrc = Err.Source Set m_adoErrors = m_dbConnection.Errors For Each m_adoErr In m_adoErrors gstrADOError = m_adoErr.Description & "," & CStr(m_adoErr.NativeError) _ & "," & CStr(m_adoErr.Number) & "," & m_adoErr.Source _ & "," & CStr(m_adoErr.SQLState) Next hFile =FreeFile If Len(strLogPath) = 0 Then strLogPath = "C:\temp\" End If expFile = strLogPath & strAppName & ".err" Open expFile For Append As #hFile Print #hFile,"**********************************" Print #hFile, Now() Print#hFile, "**********************************" Print #hFile,"Subroutine: " & tmpPro Print #hFile, "Error Number:" & gnErrNum Print#hFile, "Error Description: " & gstrErrDesc Print #hFile, "Error Source:" & gstrErrSrc Print #hFile, "Ado error String: " & gstrADOError Print #hFile, "Bad SQL: " & errSQL Close #hFile End Sub Private Sub Class_Initialize() strVersion = "xmlControl Version 1.1" "title_id,title,type,price,ytd_sales,notes,pubdate gtableName(0) = "titles" gcolumnName(0) = "title_id" gprettyName(0) = "Title Identification Number" gdatatype(0) = "number" gfilter(0) = "" gtableName(1) = "titles" gcolumnName(1) = "title" gprettyName(1) = "Title of the Book" gdatatype(1) = "text" gfilter(1) = "" gtableName(2) = "titles" gcolumnName(2) = "type" gprettyName(2) = "Type of Book" gdatatype(2) = "text" gfilter(2) = "" gtableName(3) = "titles" gcolumnName(3) = "price" gprettyName(3) = "Price of the Book" gdatatype(3) = "number" gfilter(3) = "" gtableName(4) = "titles" gcolumnName(4) = "ytd_sales" gprettyName(4) = "Year to date sales" gdatatype(4) = "number" gfilter(4) = "" gtableName(5) = "titles" gcolumnName(5) = "notes" gprettyName(5) = "Notes about the book" gdatatype(5) = "memo" gfilter(5) = "" gtableName(6) = "titles" gcolumnName(6) = "pubdate" gprettyName(6) = "Date Published" gdatatype(6) = "date" gfilter(6) = "" End Sub</p> </td> </tr></table><p>Листинг 4 - Тестовое приложение на VB для проверки WebClass</p> <table cellspacing="2" cellpadding="10" width="100%"><tr><td bgcolor="#CCCCCC"> <p>Private Sub Command1_Click() Dim objWC As xmlControl Dim xml As String Set objWC = New xmlControl objWC.strDatabase = "pubs" objWC.strServer = "ltweb" objWC.strUser = "sa" objWC.strPassword = "" objWC.lMSADO = Option2.Value objWC.strAppName = "Article1" Text1.Text = objWC.getTitlesXML End Sub</p> </td> </tr></table><p>Листинг 5 - ASP для тестирования WebClass</p> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy>");</script> <div class="clear"></div> <div class="afterpage author_rank"> <div class="social"> <div class="expert-title">Поделись статьей:</div> <div style="float:left" class="yashare-auto-init" data-yashareL10n="ru" data-yashareQuickServices="yaru,vkontakte,facebook,twitter,odnoklassniki,moimir,gplus" data-yasharetheme="counter" data-yasharetype="big"></div> </div> <div class="clear"></div> </div> <div class="clear"></div> <div class="clear"></div> <div class="related_posts"> <div class="title">Похожие статьи<span></span></div> <ul> <div class='yarpp-related'> <li> <div> <div class="top"> <div class="replace post_243"> <div class="img_border"> <span></span> <img src="/uploads/a759b9fe97ccda291ebec159edefbd07.jpg" alt="SuperBeam — мощный инструмент для передачи файлов по Wi-Fi без интернета" title="SuperBeam — мощный инструмент для передачи файлов по Wi-Fi без интернета" loading=lazy> </div> </div> </div> <div class="clear"></div> <div class="info"> <div class="date">17 апреля 2015</div> <a class="replace post_243" href="/chto-takoi-kosnites-zdes-peredach-failov-superbeam-moshchnyi.html">SuperBeam — мощный инструмент для передачи файлов по Wi-Fi без интернета</a> </div> </div> <div class="clear"></div> </li> <li> <div> <div class="top"> <div class="replace post_243"> <div class="img_border"> <span></span> <img src="/uploads/17710a78e319544a5b5d2ab44930148c.jpg" alt="Многоядерный DSP TMS320C6678" title="Многоядерный DSP TMS320C6678" loading=lazy> </div> </div> </div> <div class="clear"></div> <div class="info"> <div class="date">17 апреля 2015</div> <a class="replace post_243" href="/chto-takoe-dsp-processor-mnogoyadernyi-dsp-tms320c6678-obzor-arhitektury.html">Многоядерный DSP TMS320C6678</a> </div> </div> <div class="clear"></div> </li> <li> <div> <div class="top"> <div class="replace post_243"> <div class="img_border"> <span></span> <img src="/uploads/36f90ea9096aa5f59df5203b7540ca5a.jpg" alt="Продукция Intel: чипсеты и их особенности" title="Продукция Intel: чипсеты и их особенности" loading=lazy> </div> </div> </div> <div class="clear"></div> <div class="info"> <div class="date">17 апреля 2015</div> <a class="replace post_243" href="/sovremennye-chipsety-dlya-processorov-intel-produkciya-intel-chipsety-i-ih.html">Продукция Intel: чипсеты и их особенности</a> </div> </div> <div class="clear"></div> </li> <li> <div> <div class="top"> <div class="replace post_243"> <div class="img_border"> <span></span> <img src="/uploads/48efe173fb467c6513794422db21ed1a.jpg" alt="Caterpillar представила смартфон с тепловой камерой Cat S60" title="Caterpillar представила смартфон с тепловой камерой Cat S60" loading=lazy> </div> </div> </div> <div class="clear"></div> <div class="info"> <div class="date">17 апреля 2015</div> <a class="replace post_243" href="/protivoudarnyi-telefon-ket-s60-s-teplovizorom-caterpillar-predstavila.html">Caterpillar представила смартфон с тепловой камерой Cat S60</a> </div> </div> <div class="clear"></div> </li> </div> </ul> </div> <div class="clear"></div> <div class="clear"></div> <div class="bread_wrap" xmlns:v="http://rdf.data-vocabulary.org/#"> </div> <div class="clear"></div> </div> <div class="sidebar col-xs-12 col-md-3 col-lg-3"> <div class="aside nav podrubriki"><div class="first_title"></div><div class="subnavtitle">Типы<span></span></div><ul class="subnav"> <li><span class="asideli related-link" data-href="/category/routers/">Роутеры</span></li> <li><span class="asideli related-link" data-href="/category/hard-drives/">Жесткие диски</span></li> <li><span class="asideli related-link" data-href="/category/not-included/">Не включается</span></li> <li><span class="asideli related-link" data-href="/category/printers/">Принтеры</span></li> <li><span class="asideli related-link" data-href="/category/inhibits/">Тормозит</span></li> <li><span class="asideli related-link" data-href="/category/hangs/">Зависает</span></li> <li><span class="asideli related-link" data-href="/category/viruses/">Вирусы</span></li> <li><span class="asideli related-link" data-href="/category/tablets/">Планшеты</span></li> </div> <div class="clear"></div> <div class="sidebar_pop_articles"> <div class="title">Популярные статьи<span></span></div> <ul> <li> <div class="replace post_87"> <div class="top"> <div class="img_border"> <span></span> <img src="https://i1.wp.com/finansist24.com.ua/wp-content/uploads/2018/07/sozdat-akkaunt-steam.png" alt="Как зарегистрироваться в Steam без электронной почты" title="Как зарегистрироваться в Steam без электронной почты" loading=lazy> </div> </div> <div class="info"> <a href="/stim-zaregistrirovatsya-s-novoi-versii-kak-zaregistrirovatsya-v-steam-bez-elektronnoi-pochty-vhod-v.html" class="replace post_87">Как зарегистрироваться в Steam без электронной почты</a> </div> </div> <div class="clear"></div> </li> <li> <div class="replace post_87"> <div class="top"> <div class="img_border"> <span></span> <img src="https://i0.wp.com/mircsgo.org/wp-content/uploads/2016/06/letter_screen_2.jpg" alt="Кс го скин кэш. Как продать вещи cs:go? Можно ли доверять CSGO Cash. Какие гарантии сделок" title="Кс го скин кэш. Как продать вещи cs:go? Можно ли доверять CSGO Cash. Какие гарантии сделок" loading=lazy> </div> </div> <div class="info"> <a href="/ks-go-skin-kesh-kak-prodat-veshchi-cs-go-mozhno-li-doveryat-csgo-cash-kakie.html" class="replace post_87">Кс го скин кэш. Как продать вещи cs:go? Можно ли доверять CSGO Cash. Какие гарантии сделок</a> </div> </div> <div class="clear"></div> </li> <li> <div class="replace post_87"> <div class="top"> <div class="img_border"> <span></span> <img src="https://i0.wp.com/ixbt.com/portopc/lenovo/x1carbon/45backview.jpg" alt="Обзор ноутбука Lenovo ThinkPad X1 Carbon (2018): лёгкий, удобный, мощный" title="Обзор ноутбука Lenovo ThinkPad X1 Carbon (2018): лёгкий, удобный, мощный" loading=lazy> </div> </div> <div class="info"> <a href="/lenovo-thinkpad-x1-carbon-opisanie-obzor-noutbuka-lenovo-thinkpad-x1-carbon-2018-l-gkii.html" class="replace post_87">Обзор ноутбука Lenovo ThinkPad X1 Carbon (2018): лёгкий, удобный, мощный</a> </div> </div> <div class="clear"></div> </li> <li> <div class="replace post_87"> <div class="top"> <div class="img_border"> <span></span> <img src="https://i1.wp.com/cxem.net/sound/raznoe/transmit2.png" alt="Стереофония Устройство для приема передач на расстоянии" title="Стереофония Устройство для приема передач на расстоянии" loading=lazy> </div> </div> <div class="info"> <a href="/peredacha-audio-signala-bez-provodov-stereofoniya-ustroistvo-dlya-priema.html" class="replace post_87">Стереофония Устройство для приема передач на расстоянии</a> </div> </div> <div class="clear"></div> </li> <li> <div class="replace post_87"> <div class="top"> <div class="img_border"> <span></span> <img src="https://i0.wp.com/inetfishki.ru/wp-content/uploads/2017/020217/otvazat-instagram/2.jpg" alt="Отвязываем страничку в инстаграм от фейсбука" title="Отвязываем страничку в инстаграм от фейсбука" loading=lazy> </div> </div> <div class="info"> <a href="/kak-otkrepit-stranicu-v-feisbuk-otvyazyvaem-stranichku-v-instagram.html" class="replace post_87">Отвязываем страничку в инстаграм от фейсбука</a> </div> </div> <div class="clear"></div> </li> <li> <div class="replace post_87"> <div class="top"> <div class="img_border"> <span></span> <img src="https://i2.wp.com/nastroyvse.ru/wp-content/uploads/2017/05/etot-kompyuter-svoystva.jpg" alt="Как подключиться к компьютеру по локальной сети?" title="Как подключиться к компьютеру по локальной сети?" loading=lazy> </div> </div> <div class="info"> <a href="/kak-svyazat-kompyutery-po-wifi-kak-podklyuchitsya-k-kompyuteru-po-lokalnoi.html" class="replace post_87">Как подключиться к компьютеру по локальной сети?</a> </div> </div> <div class="clear"></div> </li> </ul> <div class="clear"></div> </div> <div class="clear"></div> <div class="sidebar_new_articles"> <div class="title">Новые статьи<span></span></div> <ul> <li> <a href="/nt-kernel-system-gruzit-sistemu-windows-chto-eto-process-system-nt-kernel-system.html" class="replace post_1054">Процесс System (NT Kernel System) грузит систему: что делать?</a> <div class="clear"></div> </li> <li> <a href="/samsung-galaxy-j3-proshivka-obnovlenie-proshivki-smartfonov-samsung-galaxy-chto.html" class="replace post_1054">Обновление прошивки смартфонов Samsung Galaxy</a> <div class="clear"></div> </li> <li> <a href="/programma-dlya-chistki-kompyutera-ot-reklamnyh-virusov-kak-ubrat-reklamu-v.html" class="replace post_1054">Как убрать рекламу в браузере: удалить баннеры и всплывающие окна</a> <div class="clear"></div> </li> <li> <a href="/chto-takoe-token-kriptovalyuty-chto-takoe-token.html" class="replace post_1054">Что такое токен криптовалюты</a> <div class="clear"></div> </li> <li> <a href="/pochemu-zhestkii-disk-skrezhet-diagnostiruem-zhestkii-disk-pri.html" class="replace post_1054">Диагностируем жесткий диск при появление посторонних тресков и шумов</a> <div class="clear"></div> </li> </ul> <div class="clear"></div> </div> <div class="clear"></div> <div class="sidebar_question"> <div id="dirace1" style="height:300px;width:200px;" align="center"></div> </div><p></p><div class="clear"></div></div> </div> <div class="clear"></div> <div class="section morkovin-antireklama-sidebar Closure"><div id="smartrotator_ad_1610"></div></div> </div> <div class="clear"></div> <div class="clear"></div> </div> </div> <div class="clear"></div> <footer class="footer"> <div class="kartasajta"><a href="/sitemap.xml">Карта сайта</a></div> <div class="top_footer"> <div class="inner"> <div class="footer_col col-xs-6 col-sm-4 col-md-4"> <span data-href="/" class="related-link logo"> <div class="logo_text1"><img src="/public/logo.png" loading=lazy></div> </span> <div class="clear"></div> <p class="copyright"> © 2024 anyhost.ru - Сайт о компьютерах и комплектующих<br /> <span></span> </p> </div> <div class="footer_col col-xs-12 col-sm-2 col-md-2"> <p class="foot_cat_title">Другое</p> <ul class="categories"> <li><span class="related-link" data-href="">О сайте</span></li> <li><span class="related-link" data-href="">Реклама</span></li> <li><span class="related-link" data-href="/feedback.html">Контакты</span></li> </ul> </div> <div class="footer_col col-xs-6 col-sm-2 col-md-2 rubric_col"> <p class="foot_cat_title">Рубрики</p> <ul id="nav" class="categories"> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/routers/">Роутеры</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/hard-drives/">Жесткие диски</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/not-included/">Не включается</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/printers/">Принтеры</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/inhibits/">Тормозит</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/hangs/">Зависает</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/viruses/">Вирусы</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/tablets/">Планшеты</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/installation/">Установка устройств</a></li> <li id="menu-item-" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="/category/application/">Приложения</a></li> </ul> </div> <div class="clear"></div> </div> </div> <div class="clear"></div> </footer> <div id="toTop"></div> <script type="text/javascript" src="https://anyhost.ru/wp-content/plugins/service_binet/ajax.js"></script><button id="responsive-menu-button" class="responsive-menu-button responsive-menu-boring responsive-menu-accessible" type="button" aria-label="Menu"> <span class="responsive-menu-box"> <span class="responsive-menu-inner"></span> </span> </button><div id="responsive-menu-container" class="slide-left" style="padding:20px;"> <ul> <li><a style="color:white;" href="/category/routers/">Роутеры</a></li> <li><a style="color:white;" href="/category/hard-drives/">Жесткие диски</a></li> <li><a style="color:white;" href="/category/not-included/">Не включается</a></li> <li><a style="color:white;" href="/category/printers/">Принтеры</a></li> <li><a style="color:white;" href="/category/inhibits/">Тормозит</a></li> <li><a style="color:white;" href="/category/hangs/">Зависает</a></li> <li><a style="color:white;" href="/category/viruses/">Вирусы</a></li> <li><a style="color:white;" href="/category/tablets/">Планшеты</a></li> <li><a style="color:white;" href="/category/installation/">Установка устройств</a></li> <li><a style="color:white;" href="/category/application/">Приложения</a></li> </ul> </div> <link rel='stylesheet' id='yarppRelatedCss-css' href='/wp-content/plugins/yet-another-related-posts-plugin/style/related.css?ver=4.9.1' type='text/css' media='all' /> <script type='text/javascript' src='https://anyhost.ru/wp-content/plugins/wp-postratings/js/postratings-js.js?ver=1.85'></script> <script type='text/javascript'> /* <![CDATA[ */ var JQLBSettings = { "fitToScreen":"1","resizeSpeed":"400","displayDownloadLink":"0","navbarOnTop":"0","loopImages":"","resizeCenter":"","marginSize":"0","linkTarget":"","help":"","prevLinkTitle":"previous image","nextLinkTitle":"next image","prevLinkText":"\u00ab Previous","nextLinkText":"Next \u00bb","closeTitle":"close image gallery","image":"Image ","of":" of ","download":"Download","jqlb_overlay_opacity":"80","jqlb_overlay_color":"#000000","jqlb_overlay_close":"1","jqlb_border_width":"10","jqlb_border_color":"#ffffff","jqlb_border_radius":"0","jqlb_image_info_background_transparency":"100","jqlb_image_info_bg_color":"#ffffff","jqlb_image_info_text_color":"#000000","jqlb_image_info_text_fontsize":"10","jqlb_show_text_for_image":"1","jqlb_next_image_title":"next image","jqlb_previous_image_title":"previous image","jqlb_next_button_image":"http:\/\/anyhost.ru\/wp-content\/plugins\/wp-lightbox-2\/styles\/images\/ru_RU\/next.gif","jqlb_previous_button_image":"http:\/\/anyhost.ru\/wp-content\/plugins\/wp-lightbox-2\/styles\/images\/ru_RU\/prev.gif","jqlb_maximum_width":"","jqlb_maximum_height":"","jqlb_show_close_button":"1","jqlb_close_image_title":"close image gallery","jqlb_close_image_max_heght":"22","jqlb_image_for_close_lightbox":"http:\/\/anyhost.ru\/wp-content\/plugins\/wp-lightbox-2\/styles\/images\/ru_RU\/closelabel.gif","jqlb_keyboard_navigation":"1","jqlb_popup_size_fix":"0"} ; /* ]]> */ </script> <script type='text/javascript' src='https://anyhost.ru/wp-content/plugins/wp-lightbox-2/wp-lightbox-2.min.js?ver=1.3.4.1'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.9.1'></script> <script async="async" type='text/javascript' src='https://anyhost.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.0.1'></script> </body> <script src="https://anyhost.ru/wp-content/themes/avada/js/jquery.jshowoff.min.js"></script> <script> (function($){ $(window).scroll(function() { if($(this).scrollTop() > 200) { $('#toTop').fadeIn(100); } else { $('#toTop').fadeOut(100); } } ); $('#toTop').click(function() { $('body,html').animate({ scrollTop:0} ,400); } ); $('.navbar-toggle').click(function(e){ e.preventDefault(); $('#navbar').show(500); $('.wrapper, footer, body, .mobile_search').addClass('righted'); $('.navbar-toggle').fadeOut(500); } ); $('.mobile_close').click(function(e){ e.preventDefault(); $('#navbar').hide(500); $('.wrapper, footer, body, .mobile_search').removeClass('righted'); $('.navbar-toggle').fadeIn(500); } ); $('#features').jshowoff({ autoPlay: true, hoverPause: false, speed:3000, changeSpeed: 200, links: true, effect: 'fade', controls: false } ); } )(jQuery); </script> <script type="text/javascript" src="//yandex.st/share/share.js" charset="utf-8"></script> </html>