Языки описания cхем XML. Язык XML - Documents Type Definitions (DTD)

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

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

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

...

Внутри же документа DTD- декларации включаются следующим образом:

... ... ]> ...

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

Определение элемента

Элемент в DTD определяется с помощью дескриптора!ELEMENT , в котором указывается название элемента и структура его содержимого.

Например, для элемента можно определить следующее правило:

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

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

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

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

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

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

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

]> ...

Marks avenue
12-12-12 46-23-62 [email protected]

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

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

могут быть определены следующие атрибуты:

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

  • CDATA - содержимым документа могут быть любые символьные данные
  • ID - определяет уникальный идентификатор элемента в документе
  • IDREF(IDREFS)- указывает, что значением атрибута должно выступать название(или несколько таких названий, разделенных пробелами во втором случае) уникального идентификатора определенного в этом документе элемента
  • ENTITY(ENTITIES) - значение атрибута должно быть названием(или списком названий, если используется ENTITIES) компонента (макроопределения), определенного в документе
  • NMTOKEN (NMTOKENS) - содержимым элемента может быть только одно отдельное слово(т.е. этот параметр является ограниченным вариантом CDATA)
  • Список допустимых значений - определяется список значений, которые может иметь данный атрибут.

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

  • #REQUIRED - определяет обязательный атрибут, который должен быть задан во всех элементах данного типа
  • #IMPLIED - атрибут не является обязательным
  • #FIXED "значение" - указывает, что атрибут должен иметь только указанное значение, однако само определение атрибута не является обязательным, но в процессе разбора его значение в любом случае будет передано программе-анализатору
  • Значение - задает значение атрибута по умолчанию

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

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

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

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

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

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

  • < - символ "<"
  • > - символ ">"
  • & - символ "&"
  • " - символ апострофа """
  • " - символ двойной кавычки """

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

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

Например, для следующего фрагмента документа:

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

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

Типизация данных

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

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

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

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

... 5 2 32.5 true 18346 34 р. 28 к. ...

Как видно из примера, механизм создания элементов документа при этом нисколько не изменился. Все необходимая для проверки типов данных информация заложена в определения элементов внутри блока DTD.

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

Как раз таковыми и являются. Причём XML сам по себе предусматривает расширяемость. Документы созданные с помощью этих языков могут быть «корректными (well-formed)» и «допустимыми (valid)».

С проверкой документа на корректность проблем не возникает: если ошибок не выскочило и всё отобразилось так, как мы хотели, то документ корректен. Например, если в HTML-документе написать что-то вроде « Привет! », то наш документ будет полностью корректен, но проигнорирован браузером. Почему? Потому что браузер ничего не знает о том, что это за «Z» такой. И если мы проверим наш документ на допустимость с помощью валидатора , то документ таковым признан не будет. А как об этом узнает валидатор и на основании чего он вынес такой вердикт?

Допустимость проверяется с помощью определения типа документа (DTD, document type definition). Например, для «строгого» HTML он выглядит так .

DTD может быть описан как внутри документа, так и вынесен в отдельный файл (аналогия с CSS: встроенные и подключаемые таблицы стилей).

Объявление DTD

Объявление DTD располагается перед первым (корневым) элементом документа, начинается с последовательности « ».

Внутреннее DTD описывается так:

Между квадратными скобками располагается содержимое DTD, так называемое внутреннее подмножество , например:

] >

Если DTD вынесено в отдельный файл (обычно имеющий расширение.dtd), то его объявление в документе записывается так:

Соответственно, в этом файле и прописываются все правила, так называемое внешнее подмножество .

Имя, указанное за словом « DOCTYPE » (в нашем случае « catalog »), должно соответствовать имени корневого элемента. То есть, XML-документ должен быть примерно таким:

Hello, world!

Вместо ключевого слова « SYSTEM » может быть использовано слово « PUBLIC », указывающее, что DTD применяется для широкого использования:

Внутренние и внешние подмножества могут быть заданы одновременно (опять же, аналогия с CSS):

] >

Здесь, сначала зачитывается содержимое файла « catalog.dtd », а потом содержимое, указанное внутри квадратных скобок.

Элементы документа

Элементы объявляются в DTD с помощью ключевого слова « ELEMENT », после которого следует имя элемента и его содержимое заключенное в круглые скобки:

Если у элемента есть дочерние элементы, то это записывается так:

что соответствует документу:

</book> </p><p>Если у элемента несколько дочерних элементов, то они перечисляются через запятую и должны следовать строго в указанном порядке:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> </p><p>Приведённый выше пример читается следующим образом. Элемент « book » должен содержать только один элемент « title », за которым должен следовать только один элемент « author ». Сами элементы « title » и « author » никаких элементов не содержат, а могут содержать лишь какой-нибудь текст.</p> <p>С помощью следующих <a href="/life-hacks/melkie-simvoly-specialnye-simvoly-dlya-nika-zv-zdochki.html">специальных символов</a> можно определять количественное присутствие элемента:</p> <ul><li>Символ « * », следующий после элемента, означает, что элемент может присутствовать один или несколько раз, или не присутствовать вовсе(от нуля до + бесконечности)</li> <li>Символ « + », следующий после элемента, означает, что элемент может присутствовать один или несколько раз(от 1 до + бесконечности)</li> <li>Символ « ? », следующий после элемента, означает, что элемент может либо отсуствовать, либо присутствовать только один раз(0 или 1)</li> </ul> <!ELEMENT book (title, author)> ... <!ELEMENT book (title*, author)> ... <!ELEMENT book (title+, author)> ... <!ELEMENT book (title?, author)> <p>Если существует необходимость указать один из нескольких элементов (или title, или author — любой из них, но не оба), надо испольовать символ « | »:</p><p> <!ELEMENT book (title | author)> </p><p>Текст тоже равноправный участник игры. Ключевое слово « PCDATA » указывает на анализируемые символьные данные, поэтому любой текст содержащий символы разметки (« < », « > » и « & ») будет трактоваться как разметка. <a href="/life-hacks-wi-fi/frilansery-dlya-sozdaniya-programm-na-android-mobilnye-prilozheniya-dlya.html">Совместное использование</a> текста и элементов называется <i>смешанным содержимым </i>. При объявлении смешанного содержимого, « PCDATA » необходимо указывать первым:</p><p> <!ELEMENT book (#PCDATA | title | author)> </p><p>Следующий фрагмент документа валиден вышеприведенному примеру:</p><p> <book> <title /> </book> <book> <author /> </book> <book> Нет данных </book> </p><p>Группы элементов заключаются в круглые скобки. Элемент « book » должен содержать либо текст, либо (один « title », один или неколько « author » и может быть один « pubyear » именно в таком порядке):</p><p> <!ELEMENT book (#PCDATA | (title, author+, pubyear?))> <!ELEMENT disc (#PCDATA | title)*> </p><p>Данному примеру соответствует следующий фрагмент XML-документа:</p><p> <disc /> <book> <title /> <author /> <author /> </book> <book> Нет данных </book> </p><p>Элемент может быть пустым. Такой элемент не может содержать не дочерних элементов ни текста (например, элемент « br » в HTML). Такой элемент задается с ключевым словом « EMPTY »:</p><p> <!ELEMENT photo EMPTY> </p><p>Элемент также может быть объявлен с ключевым словом « ANY » означающее, что элемент может содержать и элементы, и текст, и все это вместе, и даже быть пустым.</p> <h3>Атрибуты элементов</h3> <p>Элементы в XML-документе могут иметь атрибуты, которые записываются в виде « имя = значение » в открывающем или пустом тегах. Общее объявление атрибутов конкретного элемента начинается с ключевого слова « ATTLIST », после которого следует имя данного элемента и объявления самих атрибутов:</p><p> <!ELEMENT title (#PCDATA)> <!ATTLIST title id CDATA #REQUIRED stock CDATA #IMPLIED> </p><p>Ключевое слово « REQUIRED » указывает на то, что атрибут обязателен. Ключевое слово « IMPLIED », наоборот, говорит, что атрибут необязателен.</p> <p>У атрибутов могут быть перечисленны разрешенные значения:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED> </p><p>Также может быть задано значение по-умолчанию:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED "yes"> pubyear CDATA #IMPLIED "2007"> </p><p>Атрибут может быть и константой, то есть у него может быть только то значение, которое заявлено в объявлении атрибута. Делается это с помощью ключевого слова « FIXED »:</p><p> <!ATTLIST title copyright <strong>#FIXED "udvikler"> </p><p>Тип атрибута « CDATA »позволяет использовать любые символы кроме « < », « > », « & », « " » и « " ». В случае использования, данные символы должны быть заменены на спецсимволы типа « < » и т.п. Внимание : в DTD ключевое слово « CDATA » имеет другое значение, чем раздел « CDATA » в XML-документе!</p> <p>Помимо типа CDATA, атрибуты могут иметь следующие типы:</p> <ul><li>NMTOKEN - может содержать только буквы, цифры, « . », « - », « _ » и « : »</li> <li>NMTOKENS - может содержать те же символы, что и « NMTOKEN », а также символы пробела, возврата каретки, перевода строки и табуляции</li> </ul> <!ATTLIST title id CDATA #REQUIRED stock NMTOKEN #IMPLIED publisher NMTOKENS #IMPLIED> <p>Еще один тип атрибута « ID » разрешает задавать те же значения, что и тип NMTOKEN, но начинаться значение должно либо с буквы, либо с « _ », либо с « : ». У любого элемента может быть только один атрибут с типом « ID ». Атрибут типа « ID » не может быть константой (объявляться как « FIXED »). Значение атрибута типа « ID » должно быть уникальным для всего XML-документа:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ATTLIST title id ID #REQUIRED stock CDATA #IMPLIED> <!ATTLIST author id ID #REQUIRED city CDATA #IMPLIED> </p><p>Атрибут элемента может быть ссылкой на атрибут типа « ID » другого элемента. Для этого он объявляется как атрибут типа « IDREF ». Если атрибут должен ссылаться на атрибут типа « ID » нескольких элементов, то испольуется ключевое слово « IDREFS »:</p><p> <!ELEMENT book (title+, author, year, publisher)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ATTLIST title id ID #REQUIRED> <!ATTLIST author id ID #REQUIRED> <!ATTLIST year ref IDREF #REQUIRED> <!ATTLIST publisher from IDREFS #REQUIRED> </p><p>В XML-документе это будет выглядить так:</p><p> <book> <title id="t1" /> <title id="t2" /> <title id="t3" /> <author id="a1" /> <year ref="t2" /> <publisher from="t1 t2 a1" /> </book> </p><h3>Объявление сущностей</h3> <p>Помимо элементов и их атрибутов, мы можем определить <i>сущности </i>, записываемые с помощью ключевого слова « ENTITY »:</p><p> <!ENTITY name "SuperMegaMaster"> </p><p> <userName>&name;</userName> </p><p>В результате чего, на место имени сущности « name », будет подставлено ее значение, в нашем случае — « SuperMegaMaster ».</p> <p>И для полноты нашего счастья, надо добавить, что атрибуты элементов могут иметь в качестве значения подобные сущности — <i>сущности-атрибуты </i>. Они тоже определяются с помощью ключевого слова « ENTITY », но имеют одно ограничение — они должны ссылаться на внешние неанализируемые сущности, определенные во внешнем подмножестве DTD:</p><p> <!DOCTYPE catalog [ <!ENTITY list SYSTEM "companyList.html" NDATA parse> <!ELEMENT catalog (user+)> <!ELEMENT user (name)> <!ATTLIST user company ENTITY #REQUIRED> <!ELEMENT name (#PCDATA)> ] > </p><p>В вышеприведённом примере, объявлена сущность « list », которая ссылается на внешний документ « companyList.html ». Ключевое слово « NDATA », говорит о том, что внешний документ неявляется XML-документом. Далее, для элемента « user » объявляется атрибут « company », который является обязательным и имеет тип « ENTITY », то есть ссылается на какую-либо сущность. Поскольку в нашем пример задана только одна сущность (« list »), то именно она и только она может быть значением атрибута « company » в XML-документе:</p><p> <catalog> <user company="list"> <name>SuperMegaMaster</name> </user> </catalog> </p><p>Осталось только понять, что означает « parse » в строке объявления сущности « list »? Когда используются неанализируемые данные, то есть те, которые не анализируются синтаксическим анализатором XML, хорошо было бы дать информацию приложению (использующему данный XML-документ), каким образом обработать эту сущность, если все-таки потребуется. Для этого нужно использовать нотацию, задаваемую ключевым словом « NOTATION » и дополнить наш DTD следующим образом:</p><p> <!NOTATION parse SYSTEM "iexlorer"> <!ENTITY list SYSTEM "companyList.html" NDATA parse> </p><p>Слово « parse » в объявлении сущности лист указывает на то, каким образом можно проанализировать файл « companyList.html » — найти нотацию с именем « parse » и следовать ее указаниям. В нашем случае, приложение может открыть MS InternetExplorer и загрузить в него документ « companyList.html ».</p> <p>Главный писатель по вопросам технологий</p> <p>Вам кто-то послал по электронной почте файл DTD, и вы не знаете, как его открыть? Может быть, вы нашли файл DTD на вашем компьютере и вас заинтересовало, что это за файл? Windows может сказать вам, что вы не можете открыть его, или, в худшем случае, вы можете столкнуться с соответствующим сообщением об ошибке, связанным с файлом DTD.</p> <p>До того, как вы сможете открыть файл DTD, вам необходимо выяснить, к какому виду файла относится расширения файла DTD.</p> <p><b>Tip: </b> Incorrect DTD file association errors can be a symptom of other underlying issues within your Windows operating system. These invalid entries can also produce associated symptoms such as slow Windows startups, computer freezes, and other PC performance issues. Therefore, it highly recommended that you scan your Windows registry for invalid file associations and other issues related to a fragmented registry.</p> <h3>Ответ:</h3> <p>Файлы DTD имеют Файлы данных, который преимущественно ассоциирован с DesignTools 2D Design (TechSoft UK Limited).</p> <p>Файлы DTD также ассоциированы с ArcView UNIX Hyperhelp Supporting File (ESRI), SGML Document Definition File и FileViewPro.</p> <p>Иные типы файлов также могут использовать расширение файла DTD. Если вам известны любые другие форматы файлов, использующие расширение файла DTD, пожалуйста, свяжитесь с нами , чтобы мы смогли соответствующим образом обновить нашу информацию.</p> <h2>Как открыть ваш файл DTD:</h2><p>Самый быстрый и <a href="/life-hacks-in-vk/kak-zakachat-muzyku-na-iphone-tri-legkih-sposoba-zakachivaniya-muzyki-na-iphone-i.html">легкий способ</a> открыть свой файл DTD - это два раза щелкнуть по нему мышью. В данном случае <a href="/life-hacks-for-different-systems/kak-otkat-sistemy-windows-7-kak-vosstanovit-sistemu-windows-xp-gde-nahodyatsya-tochki.html">система Windows</a> сама выберет <a href="/life-hacks-for-windows/kak-sozdat-svoi-server-v-mainkraft-zagruzka-vseh-neobhodimyh.html">необходимую программу</a> для открытия вашего файла DTD.</p> <p>В случае, если ваш файл DTD не открывается, весьма вероятно, что на вашем ПК не установлена необходимая <a href="/life-hacks-wi-fi/chto-takoe-prikladnye-programmy-dlya-kompyutera-obrazovatelnoe.html">прикладная программа</a> для просмотра или редактирования файлов с расширениями DTD.</p> <p>Если ваш ПК открывает файл DTD, но в <a href="/internet/vk-zaiti-na-druguyu-stranicu-cheloveka-sposoby-togo-kak-uznat-chuzhoi-parol-v.html">неверной программе</a>, вам потребуется изменить настройки ассоциации файлов в вашем <a href="/life-hacks-for-pc/sistemnyi-reestr-windows-chto-takoe-reestr-windows-i-kak-s-nim-rabotat.html">реестре Windows</a>. Другими словами, Windows ассоциирует расширения файлов DTD с неверной программой.</p> <p>Установить необязательные продукты - FileViewPro (Solvusoft) | | | | </p> <h2>DTD Multipurpose Internet Mail Extensions (MIME):</h2> <ul><li>mime text/xml </li> </ul><h2>DTD Инструмент анализа файлов™</h2><p>Вы не уверены, какой тип у файла DTD? Хотите получить точную информацию о файле, его создателе и как его можно открыть?</p> <p>Теперь можно мгновенно получить всю <a href="/life-hacks/dlya-chego-neobhodima-kriptograficheskaya-zashchita-informacii-kriptograficheskie.html">необходимую информацию</a> о файле DTD!</p> <p>Революционный DTD Инструмент анализа файлов™ сканирует, анализирует и сообщает <a href="/computers/informacionnoi-bezopasnosti-dlya-detei-s-osobymi-potrebnostyami-posobie.html">подробную информацию</a> о файле DTD. Наш алгоритм (ожидается выдача патента) быстро проанализирует файл и через несколько секунд предоставит подробную информацию в наглядном и легко читаемом формате.†</p> <p>Уже через несколько секунд вы точно узнаете тип вашего файла DTD, приложение, сопоставленное с файлом, имя создавшего файл пользователя, статус защиты файла и другую полезную информацию.</p> <p>Чтобы начать бесплатный анализ файла, просто перетащите ваш файл DTD внутрь пунктирной линии ниже или нажмите «Просмотреть мой компьютер» и выберите файл. Отчет об анализе файла DTD будет показан внизу, прямо в окне браузера.</p> <p> <input type="hidden" name="ext" value="DTD"><img src='https://i1.wp.com/solvusoft.com/file-extensions/images/icon_file_analysis.png' height="239" width="256" loading=lazy></p><h3>Перетащите файл DTD сюда для начала анализа</h3> <p> <input id="inputFile" class="bodyBig" type="file" name="file_1" size="12" style="display:none;"> Просмотреть мой компьютер »</p> <p><input type="checkbox" value="unchecked"> Пожалуйста, также проверьте мой файл на вирусы</p> <p>Ваш файл анализируется... пожалуйста подождите.</p> <p><b>20. Языки описания cхем XML </b></p><p><i><b>DTD схемы. Недостатки DTD схем. XDR схемы. Элементы и атрибуты XDR схем. </b> </i></p><p>Идея создания собственных тэгов, имеющих специальное значение и помогающих описать содержание документа, сама по себе просто замечательна. Но если каждый пользователь может создавать свои собственные описания, каким образом их распознавать? С этой целью в спецификации XML для описания подобных "самодеятельных" тэгов используются схемы. Они необходимы для того, чтобы:</p><ul><p>описать, что именно является разметкой;</p><p>описать точно, что означает разметка.</p> </ul><p>Наиболее известными языками описания схем являются следующие:</p><ul><p>DTD (<a href="/internet/opisanie-struktury-xml-dokumenta-sredstvami-dtd-document-type-definition-vvedenie-v.html">Document Type</a> Definition) - язык определения типа документов, который первоначально использовался в качестве язык описания структуры SGML-документа.</p><p>XDR (XML Data Reduced) – диалект схемы XML, разработанный Microsoft, который поддерживался в Internet Explorer 4 и 5 версий.</p><p>XML Schema или просто XSD (язык определения схем XML) – рекомендация консорциума W3C с 2001 года.</p> </ul><p>Рассмотрим подробнее первые два из них. Третий язык описания схем рассматривается в лабораторной работе 11.</p><p><b>DTD схема </b></p><p>Схема DTD предоставляет шаблон разметки документа, в котором указываются наличие, порядок следования и расположение элементов и их атрибутов в документе XML.</p><p>В рамках DTD модель содержимого XML документа можно описать следующим образом:</p><p>Каждый элемент документа может иметь один из типов:</p><table width="630" cellpadding="2" cellspacing="0"><tr><td width="117" bgcolor="#d8d8d8"> </td><td width="239" bgcolor="#d8d8d8"> <p><b>Синтаксис </b></p> </td><td width="261" bgcolor="#d8d8d8"> <p><b>Комментарий </b></p> </td> </tr><tr valign="top"><td width="117" bgcolor="#eaeaea"> </td><td width="239" bgcolor="#eaeaea"> <p><!ELEMENT имя (#PCDATA)></p> </td><td width="261" bgcolor="#eaeaea"> <p>Содержит только текстовые данные</p> </td> </tr><tr valign="top"><td width="117" bgcolor="#eaeaea"> <p>Другие элементы</p> </td><td width="239" bgcolor="#eaeaea"> <p><!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)></p> </td><td width="261" bgcolor="#eaeaea"> <p>Содержит только дочерние элементы</p> </td> </tr><tr valign="top"><td width="117" bgcolor="#eaeaea"> <p>Смешанное</p> </td><td width="239" bgcolor="#eaeaea"> <p><!ELEMENT имя (#PCDATA, дочерний элемент)*></p> </td><td width="261" bgcolor="#eaeaea"> <p>Содержит комбинацию текстовых данных и дочерних элементов</p> </td> </tr><tr valign="top"><td width="117" bgcolor="#eaeaea"> </td><td width="239" bgcolor="#eaeaea"> <p><!ELEMENT имя EMPTY></p> </td><td width="261" bgcolor="#eaeaea"> <p>Ничего не содержит</p> </td> </tr><tr valign="top"><td width="117" bgcolor="#eaeaea"> </td><td width="239" bgcolor="#eaeaea"> <p><!ELEMENT имя ANY></p> </td><td width="261" bgcolor="#eaeaea"> </td> </tr></table><p>Атрибуты, находящиеся внутри тэгов документа, описываются отдельно с помощью синтаксиса:</p><p>имя_элемента имя_атрибута1 (тип) значение_по_умолчанию</p><p>…………………………………………………………………………………...</p><p>имя_элемента имя_атрибутаN (тип) значение_по_умолчанию ></p><p>При этом атрибут в DTD может иметь один из трех типов:</p><ul><li><p>Маркированные атрибут</p><p>Атрибута с перечислением</p> </ul><p>Кроме типа атрибута можно также задавать и его модальность:</p><p>Рассмотрим в качестве примера описание атрибутов строкового типа для элемента, описывающего некоторое сообщение:</p><p><!ATTLIST message</p><p>number CDATA #REQUIRED</p><p>date CDATA #REQUIRED</p><p>from CDATA #FIXED</p><p>status CDATA #IMPLIED></p><p>Если этот элемент содержит атрибуты с перечислением, то их описание может выглядеть, например, следующим образом:</p><p><!ATTLIST message</p><p>number ID #REQUIRED</p><p>from CDATA #REQUIRED</p><p>alert (low | normal | urgent) "normal"></p><p>Маркированных атрибуты элемента могут быть четырех типов:</p><p>И, наконец, в DTD можно использовать следующие индикаторы вхождения последовательностей:</p><table width="630" cellpadding="2" cellspacing="0"><tr><td width="72" bgcolor="#d8d8d8"> <p><b>Символ </b></p> </td><td width="98" bgcolor="#d8d8d8"> <p><b>Пример </b></p> </td><td width="447" bgcolor="#d8d8d8"> <p><b>Описание </b></p> </td> </tr><tr valign="top"><td width="72" bgcolor="#eaeaea"> </td><td width="98" bgcolor="#eaeaea"> </td><td width="447" bgcolor="#eaeaea"> <p>Последовательное использование элементов списка</p> </td> </tr><tr valign="top"><td width="72" bgcolor="#eaeaea"> </td><td width="98" bgcolor="#eaeaea"> </td><td width="447" bgcolor="#eaeaea"> <p>Используется один из членов списка</p> </td> </tr><tr valign="top"><td width="72" bgcolor="#eaeaea"> </td><td width="98" bgcolor="#eaeaea"> </td><td width="447" bgcolor="#eaeaea"> <p>Используется один и только один элемент</p> </td> </tr><tr valign="top"><td width="72" bgcolor="#eaeaea"> </td><td width="98" bgcolor="#eaeaea"> </td><td width="447" bgcolor="#eaeaea"> <p>Необязательное использование (0 или 1 раз)</p> </td> </tr><tr valign="top"><td width="72" bgcolor="#eaeaea"> </td><td width="98" bgcolor="#eaeaea"> </td><td width="447" bgcolor="#eaeaea"> <p>Используется один или несколько раз</p> </td> </tr><tr valign="top"><td width="72" bgcolor="#eaeaea"> </td><td width="98" bgcolor="#eaeaea"> </td><td width="447" bgcolor="#eaeaea"> <p>Используется ноль или несколько раз</p> </td> </tr></table><p>В качестве примера приведем DTD схему, описывающую структуру электронного почтового ящика:</p><p><!ELEMENT mailbox (message*)></p><p><!ELEMENT message (head, body)></p><p><!ATTLIST message uid CDATA #REQUIRED></p><p><!ELEMENT head (from,to+, subject?, CC*, notify?) ></p><p><!ELEMENT from (#PCDATA)></p><p><!ELEMENT to (#PCDATA)></p><p><!ELEMENT subject (#PCDATA)></p><p><!ELEMENT CC (#PCDATA)></p><p><!ELEMENT notify EMPTY></p><p><!ELEMENT body (#PCDATA)></p><p>Исходный XML документ, удовлетворяющий данной схеме, может выглядеть, например, так:</p><p><?xml version="1.0" ?></p><p><!DOCTYPE mailbox SYSTEM "mailbox.dtd"></p><p><message uid="1"></p><p><from>user1@myhp.edu</from></p><p><to>user2@myhp.edu</to></p><p><subject>Re:</subject></p><p><message uid="2"></p><p><from>user3@myhp.edu</from></p><p><to>user2@myhp.edu</to></p><p><subject>Remind</subject></p><p><CC> user1@myhp.edu </CC></p><p>Remind me about meeting.</p><p>Обратите внимание на 2-ю строчку документа, в которой указывается <a href="/life-hacks-for-windows/chto-oznachaet-adblock-kak-otklyuchit-plagin-adblock-v-hrome-ubrat-vneshnie-ssylki-iz.html">внешняя ссылка</a> на файл, содержащий DTD схему.</p><p>В принципе, DTD допускает два способа использования в XML документе.</p><p>Объявление внутренней схемы:</p><p><!DOCTYPE корневой_элемент [</p><p><!ELEMENT корневой_элемент (модель содержания)></p><p>Объявление внешней схемы:</p><p><!DOCTYPE корневой_элемент SYSTEM "name.DTD"></p><p>В заключение укажем на следующие недостатки DTD схем:</p><ul><p>Не являются экземплярами XML. Требуется изучение совершенно другого языка.</p><p>Не предоставляют контроль за типами данных, за исключением самых простых текстовых данных.</p><p>Не являются экземплярами XML, поэтому их нельзя легко расширить или преобразовать к другим языкам разметки – HTML или DHTML.</p><p>Не обеспечивают поддержки пространств имен XML.</p> </ul><p><b>XDR схема </b></p><p>XML-Data – <a href="/life-hacks-in-vk/kak-dobavit-prozvishche-v-kontakte-kak-sdelat-v-vk-otchestvo-vozvrashchaem.html">полное имя</a> языка описания схем, предложенного Майкрософт, а XML-DataReduced– это "часть" полной рекомендации. Схема XDR - это экземпляр XML, т.е. соответствует всем синтаксическим правилам и стандартам XML.</p><p>Реализуя проверки данных на уровне документа с помощью схемы, приложения, генерирующие и принимающие транзакции, можно оптимизировать для обеспечения максимального быстродействия. Соответствие полей и правильность записей проверяются на уровне экземпляров XML.</p><p>Корневым элементом в схеме XDR всегда является элемент Schema:</p><p>name="имя_схемы" xmlns="urn:schemas-microsoft-com:xml-data"</p><p>xmlns:dt="urn:schemas-microsoft-com:datatypes"></p><p><-- Объявления других элементов --></p><p>Элемент ElementType имеет синтаксис:</p><p>content="{empty | texOnly | eltOnly | mixed}"></p><p>dt:type "datatype"</p><p>model="{open | closed}"</p><p>order="{one | seq | many}"</p><p>Элемент ElementType может иметь следующие атрибуты:</p><table width="630" cellpadding="2" cellspacing="0"><tr valign="top"><td width="89" bgcolor="#eaeaea"> <p><b>Имя атрибута </b></p> </td><td width="533" bgcolor="#eaeaea"> <p><b>Описание </b></p> </td> </tr><tr valign="top"><td width="89" bgcolor="#eaeaea"> </td><td width="533" bgcolor="#eaeaea"> <p>Имя элемента</p> </td> </tr><tr valign="top"><td width="89" bgcolor="#eaeaea"> </td><td width="533" bgcolor="#eaeaea"> </td> </tr><tr valign="top"><td width="89" bgcolor="#eaeaea"> </td><td width="533" bgcolor="#eaeaea"> <p>Тип данных элемента</p> </td> </tr><tr valign="top"><td rowspan="3" width="89" bgcolor="#eaeaea"> </td><td width="533" bgcolor="#eaeaea"> <p>Может принимать значения:</p> </td> </tr><tr><td width="533" valign="top" bgcolor="#eaeaea"> <p>Open – разрешено <u>использовать </u> элементы, не определенные в схеме</p> </td> </tr><tr><td width="533" valign="top" bgcolor="#eaeaea"> <p>Closed – запрещено использовать элементы, не определенные в схеме</p> </td> </tr><tr valign="top"><td rowspan="4" width="89" bgcolor="#eaeaea"> </td><td width="533" bgcolor="#eaeaea"> <p>Порядок следования дочерних элементов в экземпляре XML. <a href="/life-hacks/oblast-dopustimyh-znachenii-odz-teoriya-primery-resheniya-oblast.html">Допустимые значения</a>:</p> </td> </tr><tr><td width="533" valign="top" bgcolor="#eaeaea"> <p>one – предполагается наличие одного документа</p> </td> </tr><tr><td width="533" valign="top" bgcolor="#eaeaea"> <p>many – любое количество элементов в любом порядке</p> </td> </tr><tr><td width="533" valign="top" bgcolor="#eaeaea"> <p>seq – элементы указываются в строго заданном порядке.</p> </td> </tr></table><p>качестве дочерних элементов для ElementType можно использовать следующие:</p><table width="630" cellpadding="2" cellspacing="0"><tr valign="top"><td width="133" bgcolor="#eaeaea"> <p><b>Имя элемента </b></p> </td><td width="488" bgcolor="#eaeaea"> <p><b>Описание </b></p> </td> </tr><tr valign="top"><td width="133" bgcolor="#eaeaea"> </td><td width="488" bgcolor="#eaeaea"> <p>Объявляет дочерний элемент</p> </td> </tr><tr valign="top"><td width="133" bgcolor="#eaeaea"> </td><td width="488" bgcolor="#eaeaea"> <p>Обеспечивает описание элемента ElementType</p> </td> </tr><tr valign="top"><td width="133" bgcolor="#eaeaea"> </td><td width="488" bgcolor="#eaeaea"> <p>Обеспечивает тип данных элемента ElementType</p> </td> </tr><tr valign="top"><td width="133" bgcolor="#eaeaea"> </td><td width="488" bgcolor="#eaeaea"> <p>Определяет порядок следования элементов</p> </td> </tr><tr valign="top"><td width="133" bgcolor="#eaeaea"> </td><td width="488" bgcolor="#eaeaea"> <p>Определяет атрибут</p> </td> </tr><tr valign="top"><td width="133" bgcolor="#eaeaea"> </td><td width="488" bgcolor="#eaeaea"> <p>Определяет сведения о <a href="/life-hacks-for-windows/tehniki-raboty-s-dom-roditelskie-dochernie-i-sosednie-elementy.html">дочернем элементе</a> AttributeType</p> </td> </tr></table><p>Для объявления атрибутов используется синтаксис:</p><p><AttributeType</p><p>default="default-value"</p><p>dt:type="primitive-type"</p><p>dt:values="enumerated-values"</p><p>required="{yes|no}"</p><p>В свою очередь элемент AttributeType может иметь атрибуты:</p><table width="630" cellpadding="2" cellspacing="0"><tr valign="top"><td width="83" bgcolor="#eaeaea"> <p><b>Значение </b></p> </td><td width="539" bgcolor="#eaeaea"> <p><b>Описание </b></p> </td> </tr><tr valign="top"><td width="83" bgcolor="#eaeaea"> </td><td width="539" bgcolor="#eaeaea"> <p>Значение по умолчанию</p> </td> </tr><tr valign="top"><td rowspan="2" width="83" bgcolor="#eaeaea"> </td><td width="539" bgcolor="#eaeaea"> <p>Один из следующих типов:</p> </td> </tr><tr><td width="539" valign="top" bgcolor="#eaeaea"> <p>entity, entities, enumeration, id, idref, nmtoken, nmtokens, notation, string</p> </td> </tr><tr valign="top"><td width="83" bgcolor="#eaeaea"> </td><td width="539" bgcolor="#eaeaea"> <p>Допустимые значения</p> </td> </tr><tr valign="top"><td width="83" bgcolor="#eaeaea"> </td><td width="539" bgcolor="#eaeaea"> <p>Имя атрибута</p> </td> </tr><tr valign="top"><td width="83" bgcolor="#eaeaea"> </td><td width="539" bgcolor="#eaeaea"> <p>Указывает на обязательное наличие атрибута в описании</p> </td> </tr></table><p>Синтаксис для описания элемента attribute выглядит следующим образом:</p><p>default="default-value"</p><p>type="attribute-type"</p><p>а его возможные значения могут быть такими:</p><table width="630" cellpadding="2" cellspacing="0"><tr valign="top"><td width="83" bgcolor="#eaeaea"> <p><b>Значение </b></p> </td><td width="539" bgcolor="#eaeaea"></td></tr></table> <p>Аннотация: <span>В данном разделе описываются общие принципы написания Определение типа документа. Так же рассмотрены основные недостатки и особенности DTD. </p><h3>Зачем нужно DTD.</h3><p>Создавая XML документ разработчик сам решает: как назвать теги, в каком порядке они будут следовать, какие данные будут записаны в том или ином элементе, будут ли у элемента атрибуты или нет и многое другое. Без формального описания структуры документа этим самым документом может воспользоваться только его разработчик. В случае если разработанный XML документ предназначен для передачи во внешний мир, например партнерам по бизнесу, и если к тому же планируется получать в ответ документы, написанные в том же самом формате без определения типов документов ( Document Type Definition , DTD ) не обойтись. Это связано с тем, что для того, что бы обе стороны могли понимать полученную информацию элементы и атрибуты в документах должны употребляться всеми сторонами одинаково. Определения типа документа вносят строгость и точность в правила написания правильно оформленных документов XML . Хранимые в начале файла XML или внешним образом в виде файла *.DTD , определения типов документов описывают информационную структуру документа. В DTD перечисляются возможные имена элементов, определяются имеющиеся атрибуты для каждого типа элементов и описывается вложенность элементов.</p><p>XML используется в качестве средства для описания грамматики других языков. И таким образом разрабатывая некоторый язык для написания XML документов в той или иной области нам придется разработать словарь данной области деятельности. DTD по определению содержат всю информацию которая может появиться в XML документе. Все, что входит в проект, должно быть включено в DTD . Таким образом DTD описания в сущности и является таким словарем. Современный мир меняется достаточно динамично поэтому заранее не известно какая информация может потребоваться в дальнейшем и для того что бы не пришлось часто изменять структуру документов обычно разрабатываемый словарь включает в себя все что может понадобиться для конкретных видов бизнеса или промышленности. Это позволяет использовать определения DTD как средство анализа и проектирования. Приложения XML взаимодействуют друг с другом на основе словарей, которые они понимают, так что определение DTD помогает понять, что может описать приложение .</p><p>Другое применение DTD это проверка написанного XML документа на корректность . Правильно оформленные документы, написанные в соответствии со всеми правилами, описанными в спецификации XML , не могут быть проверены на предмет ошибок. Пропущенные ошибки могут вызвать повреждение программы обрабатывающей данные документы, либо ввод в систему неверных данных. Но если документ ссылается на определение DTD , то, используя проверяющий на допустимость анализатор можно проверить, есть ли в нашем документе ошибки. Анализатор затребует DTD и убедится, что документ соответствует описанным в нем грамматическим правилам. Анализатор обнаруживает структурные ошибки и ошибки содержания, что намного уменьшает объем проверок, выполняемых логикой приложения.</p> <h3>Написание определений DTD: общие принципы.</h3> <h4>Ассоциирование DTD с документом XML</h4><p>Для связывания декларации DTD с экземпляром документа в версии XML 1.0 предлагается специальная декларация DOCTYPE . Она должна следовать после декларации XML и предшествовать любым элементам документа. Тем не менее, между декларациями XML и DOCTYPE могут находиться комментарии и команды обработки.</p><p>Декларация DOCTYPE содержит ключевое слово DOCTYPE , за которым следует имя корневого элемента документа, а затем конструкция с декларациями содержания. Перед разъяснением этого утверждения рассмотрим пример расположения декларации DOCTYPE в экземпляре документа. Ниже приводятся первые три строчки документа XML:</p><p>.. <xml version ="1.0" ?> <!DOCTYPE root_element_name … > <root_element_name > …</p><p>Можно написать внешнее подмножество деклараций в отдельном файле DTD , включить внутреннее подмножество в тело декларации DOCTYPE или сделать то и другое. В последнем случае (смешение внутренних и внешних DTD ) во внутренних DTD могут быть заданы новые декларации или переписаны те, что содержатся во внешних (по определению спецификации XML анализаторы сначала читают внутреннее подмножество, и потому содержащиеся там декларации пользуются приоритетом).</p><p>Декларации XML могут содержать атрибут standalone, принимающий только значения "yes" и "nо". Если значение атрибута равно yes, то внешние для экземпляра документа декларации не влияют на информацию, передаваемую документом использующему его приложению. Значение no показывает, что существуют внешние декларации со значениями, необходимыми для правильного описания содержания документа - например конкретные значения по умолчанию. На практике не<a href="/life-hacks-for-pc/kakie-atributy-yavlyayutsya-obyazatelnymi-dlya-tega-input-adresa-elektronnoi-pochty.html">обязательный атрибут</a> standalone используется редко. Наличие этого атрибута со значением, yes не гарантирует отсутствия внешних зависимостей любого типа. Просто внешние зависимости в этом случае не приведут к ошибке в документе, если не будут включены в обработку. Таким образом, в основном этот атрибут представляет собой знак для анализаторов и других приложений, показывающий, нужно ли им использовать какое-либо внешнее содержание.</p><p>Блок внутренней декларации разметки тега DOCTYPE состоит из левой квадратной скобки, списка деклараций и правой квадратной скобки:</p><p>Внутренние DTD очень полезны, они всегда содержатся в использующем их документе и поэтому их получение анализатором не представляет проблем. Однако внутренние DTD значительно увеличивают размер документа. На практике внутренние DTD чаще всего применяются одновременно с внешними для добавления новых декларации. Если там объявлен какой-либо объект, продекларированный также и во внешнем определении DTD , приоритетом пользуется внутреннее. Это позволяет осуществлять тонкую настройку деклараций для нужд конкретных документов.</p><p>Внешние DTD в некоторых отношениях более гибкие. В данном случае декларация DOCTYPE состоит из обычного ключевого слова и имени корневого элемента, за которым следует еще одно ключевое слово SYSTEM либо PUBLIC , обозначающее источник внешнего определения DTD , а за ним - локализация этого определения. Если ключевое слово SYSTEM , DTD обязано непосредственно и явным образом находится по указанному URL адресу.</p><p>Если внешние DTD переписываются очень часто, они начинают терять свое значение, а это признак плохого первоначального проекта.</p><p>Ключевое слова PUBLIC предназначено для хорошо известных словарей. Приложение, анализирующее документ из этого словаря, должно использовать некоторую стратегию по поиску соответствующего DTD .</p><p>Стандарт XML 1.0 допускает у декларации PUBLIC наличие как публичного URI , так и системного идентификатора. Если работающее с документом приложение или анализатор не могут найти DTD по идентификатору URI с <a href="/life-hacks-for-pc/statistika-zaprosov-po-klyuchevym-slovam-servis-podbora-slov-v-yandekse-chto.html">ключевым словом</a> PUBLIC , оно должно использовать системный идентификатор.</p> <h4>Основные декларации разметки</h4><p>Допустимое в документе XML содержание определяется с помощью четырех типов декларации разметки в DTD . В следующей далее таблице показаны связанные с этими декларациями ключевые слова и их значения:</p><p>Первые два типа связаны с информацией, которую мы рассчитываем найти в документе XML, - элементами и атрибутами.</p><p>Последние два типа используются для поддержки. Особенно облегчают жизнь разработчика словаря XML сущности. Как правило, они состоят из содержания, которое настолько часто используется в DTD или документе, что оправдывает создание специальной декларации. Применение этой декларации напоминает оператор include в языках C/C++ , когда в качестве замены для содержания используется имя.</p><p>Нотации описывают содержание, разработанное не на языке XML. Используются они для того, чтобы объявить конкретный класс данных и связать его с внешней программой. Эта внешняя программа становится обработчиком объявленного класса данных. Например, связав с документом изображение в формате JPEG, разработчик желает, чтобы программа приняла и визуализировала двоичные данные в этом формате. Конечно, в таком случае документ зависит от того, какой обработчик имеется в системе, получающей документ. В интересах портативности и переносимости некоторые авторы не приводят ссылки на обработчики. В таком случае нотация превращается просто в механизм набора текста.</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> </article> <div class='yarpp-related'> <div class="related-items"> <div class="headline">Рекомендуем другие статьи</div> <div class="items"> <div class="item"> <a href="/ios/twitch-servis-dlya-video-translyacii-strimov-tvich-twitch-chto-eto-i-kak.html" class="item__link"> <img src="/uploads/fff6799ee59d8502f5ed771cdcd8324b.jpg" width="220" height="170" alt="Твич (twitch): что это и как работает?" class="item__image" / loading=lazy> <div class="item__title">Твич (twitch): что это и как работает?</div> </a> </div> <div class="item"> <a href="/reviews/kak-prazdnovat-letnee-solncestoyanie-kak-prazdnovat-letnee-solncestoyanie.html" class="item__link"> <img src="/uploads/d002eb7ee7f8ca5839027a5ec58464a2.jpg" width="220" height="170" alt="Как праздновать летнее солнцестояние Эммануэль Дагер: Исцеляющее солнцестояние" class="item__image" / loading=lazy> <div class="item__title">Как праздновать летнее солнцестояние Эммануэль Дагер: Исцеляющее солнцестояние</div> </a> </div> <div class="item"> <a href="/internet/programmirovanie-mikrokontrollerov-dlya-nachinayushchih-legko-i.html" class="item__link"> <img src="/uploads/cc080e5fe541f0a30c5c0fdf1654e93a.jpg" width="220" height="170" alt="Программирование микроконтроллеров AVR для начинающих Программирование контроллеров avr для начинающих" class="item__image" / loading=lazy> <div class="item__title">Программирование микроконтроллеров AVR для начинающих Программирование контроллеров avr для начинающих</div> </a> </div> </div> </div> </div> </main> <aside class="sidebar"> <div class="section"> <div class="section__headline">Самое популярное</div> <div class="sidebar-items"> <a class="sidebar-item" href="/life-hacks-for-ios/pochemu-planshet-ne-vyklyuchaetsya-chto-delat-zavis-planshet---chto-delat-vozmozhnye.html"> <img src="/uploads/2df7bea5ce83ad887e3040165488a737.jpg" width="75" height="75" alt="Завис планшет - что делать?" class="sidebar-item__image" / loading=lazy> <div class="sidebar-item__title">Завис планшет - что делать?</div> </a> <a class="sidebar-item" href="/program/videonablyudenie-cherez-usb-kameru-besprovodnaya-usb-kamera-kupit.html"> <img src="/uploads/c5ad1ebb2eec805aceb765a476962621.jpg" width="75" height="75" alt="Беспроводная USB камера купить беспроводную мини камеру компьютера Цифровая камера с usb выходом" class="sidebar-item__image" / loading=lazy> <div class="sidebar-item__title">Беспроводная USB камера купить беспроводную мини камеру компьютера Цифровая камера с usb выходом</div> </a> <a class="sidebar-item" href="/life-hacks-for-pc/sem-putei-voiti-v-svoi-lichnyi-kabinet-stoloto-russkoe-loto-obman.html"> <img src="/uploads/ef0eb579f517d663a977671e7a51ce14.jpg" width="75" height="75" alt="Столото, Русское лото – обман?" class="sidebar-item__image" / loading=lazy> <div class="sidebar-item__title">Столото, Русское лото – обман?</div> </a> <a class="sidebar-item" href="/internet/v-chem-smysl-maininga-kak-rabotaet-maining-kriptovalyuty-process.html"> <img src="/uploads/e7ccb6fbe0cf024cedb045c511cf5fad.jpg" width="75" height="75" alt="Как работает майнинг криптовалюты Процесс майнинга криптовалют" class="sidebar-item__image" / loading=lazy> <div class="sidebar-item__title">Как работает майнинг криптовалюты Процесс майнинга криптовалют</div> </a> <a class="sidebar-item" href="/game/professiya-programmist-dlya-detei-konspekt-zanyatiya-v-detskom.html"> <img src="/uploads/9d0201b81adc610408d4507ccf6f9186.jpg" width="75" height="75" alt="Конспект занятия в детском саду «Программист – великий волшебник" class="sidebar-item__image" / loading=lazy> <div class="sidebar-item__title">Конспект занятия в детском саду «Программист – великий волшебник</div> </a> <a class="sidebar-item" href="/life-hacks-for-ios/aliekspress-prosit-ukazat-proverochnyi-kod-pri-vhode-chto.html"> <img src="/uploads/85f99bb622febba2f51f6ce46c571a8f.jpg" width="75" height="75" alt="Как пройти проверку при входе в аккаунт на Алиэкспресс?" class="sidebar-item__image" / loading=lazy> <div class="sidebar-item__title">Как пройти проверку при входе в аккаунт на Алиэкспресс?</div> </a> </div> </div> <script> // <![CDATA[ $(document).ready(function() { var floatsidebar = $("#float-sidebar"); var offset = floatsidebar.offset(); var left = offset.left; var top = offset.top; var width = $("#float-sidebar").width(); var height = $("#float-sidebar").height(); $(window).scroll(function() { var scrollTop = $(window).scrollTop(); if (scrollTop >= top) { $('#float-sidebar').css({ left: left + 'px', position: 'fixed', top: "50px", width: width + "px" }); } else { $('#float-sidebar').css({ position: 'static', }); } }); }); // ]]> </script> <div id="float-sidebar"> <div id="laqybe1" style="height:500px;width:270px;" align="center"></div> </div> </aside> </div> <footer class="footer"> <div class="footer-left"> <div class="footer__logo"> <div class="footer__logo-sitename">radiobud.ru</div> </div> <div class="footer__copyright"> <p>© 2024 - radiobud.ru<br /></p> <p>Обзоры, лайфхаки, игры, программы</p> </div> <nav class="footer__nav-1"> <ul> <li class="menu-item type-post_type object-page "><a href="/sitemap.xml">Карта сайта</a></li> </ul> </nav> </div> <nav class="footer__nav-2"><ul> <li class="menu-item type-taxonomy object-category "><a href="/feedback.html">Контакты</a></li> <li class="menu-item type-taxonomy object-category "><a href="">Реклама</a></li> <li class="menu-item type-taxonomy object-category "><a href="">О сайте</a></li> </ul></nav> <div class="footer__counters"> </div> <div class="footer__note"></div> </footer> </div> </div> <script type='text/javascript' src='https://radiobud.ru/wp-content/themes/radiobud.ru/js/scripts.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.9.1'></script> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1","visibility_show":"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c","visibility_hide":"\u0421\u043a\u0440\u044b\u0442\u044c","width":"Auto"} ; /* ]]> */ </script> <script type='text/javascript' src='https://radiobud.ru/wp-content/plugins/table-of-contents-plus/front.min.js?ver=1509'></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://radiobud.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.0.2'></script> </body> </html><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>