Содержание

XML практически всегда применяется не по назначению / Хабр

Язык XML был изобретен в 1996 году. Едва он успел появиться, как возможности его применения уже начали понимать неправильно, и для тех целей, к которым его пытались адаптировать, он был не лучшим выбором.

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

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

Если не вдаваться в детали, XML лучше всего подходит для аннотирования блоков текста со структурой и метаданными. Если вашей главной задачей не является работа с блоком текста, выбор XML вряд ли будет оправдан.

С этой точки зрения существует простой способ проверить, насколько хорошо сделана схема XML. Возьмем для примера документ в предполагаемой схеме и удалим из него все теги и атрибуты. Если в том, что осталось, нет смысла (или если осталась пустая строка), то либо ваша схема построена неправильно, либо вам просто не стоило применять XML.

Далее я приведу несколько наиболее часто встречающихся примеров неправильно построенных схем.

<roоt>
  <item name="name" value="John" />
  <item name="city" value="London" />
</roоt>

Здесь мы видим пример необоснованной и странной (хоть и весьма распространенной) попытки выразить языком XML простой словарь «ключ-значение». Если удалить все теги и атрибуты, останется пустая строка. По существу данный документ представляет собой, как бы абсурдно это ни звучало, семантическую аннотацию пустой строки.

<root name="John" city="London" />

Что еще хуже, у нас здесь не просто семантическая аннотация пустой строки как экстравагантный способ выражения словаря — на этот раз «словарь» напрямую закодирован в виде атрибутов корневого элемента. Из-за этого заданный набор имен атрибутов на элементе становится неопределенным и динамическим. Более того, отсюда видно, что все, что на самом деле хотел выразить автор, — это простой синтаксис «ключ-значение», но вместо этого он принял абсолютно странное решение применить XML, принудительно задавая использование одиночного пустого элемента просто в качестве префикса для использования синтаксиса атрибутов. И такие схемы попадаются мне очень часто.

<roоt>
  <item key="name">John</item>
  <item key="city">London</item>
</roоt>

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

Правильное выражение словаря в XML будет выглядеть приблизительно так:

<roоt>
  <item>
    <key>Name</key>
    <value>John</value>
  </item>
  <item>
    <key>City</key>
    <value>London</value>
  </item>
</roоt>

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

Самая худшая схема XML? Кстати, приз за самую худшую схему XML, которую мне доводилось видеть, получает формат файла конфигурации автоматического выделения ресурсов для телефонов IP-телефонии Polycom. Такие файлы требуют загрузки XML-файлов запроса по TFTP, которые… В общем, вот отрывок из одного такого файла:

<softkey
        softkey.feature.directories="0"
        softkey.feature.buddies="0"
        softkey.feature.forward="0"
        softkey.feature.meetnow="0"
        softkey.feature.redial="1"
        softkey.feature.search="1"
        softkey.1.enable="1"
        softkey.1.use.idle="1"
        softkey.1.label="Foo"
        softkey.1.insert="1"
        softkey.1.action="..."
        softkey.2.enable="1"
        softkey.2.
use.idle="1" softkey.2.label="Bar" softkey.2.insert="2" softkey.2.action="..." />

Это не чья-то неудачная шутка. И это не моя выдумка:

  • элементы просто используются как префикс для прикрепления атрибутов, которые сами по себе имеют иерархические имена.
  • Если нужно приписать значения нескольким экземплярам записи определенного вида, для этого необходимо использовать имена атрибутов,
    в которых есть индексы
    .
  • Кроме этого, атрибуты, начинающиеся с softkey., нужно помещать на элементы <softkey/>, атрибуты, начинающиеся с feature., нужно помещать на элементы <feature/> и т. д., несмотря на то, что это выглядит совершенно излишним и на первый взгляд бессмысленным.
  • И, наконец, если вы надеялись, что первый компонент имени атрибута всегда совпадает с именем элемента — ничего подобного! Например, атрибуты up.
    должны прикрепляться к <userpreferences/>. Порядок прикрепления имен атрибутов к элементам — произвольный, причем практически полностью.

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

Разобраться в этом поможет понятие разницы между документами и данными

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

К примеру, в XML имеет значение порядок элементов. А в JSON порядок следования пар «ключ-значение» внутри объектов не имеет смысла и не определен. Если вы хотите получить неупорядоченный словарь из пар «ключ-значение», фактический порядок, в котором следуют элементы в этом файле, не имеет значения. Но вы можете сформировать из этих данных много разных

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

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

Другими словами, словарь (фрагмент структурированных данных) может быть преобразован в n различных возможных документов (в формате XML, PDF, на бумаге и т. п.), где n — количество возможных комбинаций элементов в словаре, и это мы еще не учли другие возможные переменные.

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

Более того, поскольку в XML нет понятия чисел (или булевых выражений, либо других типов данных), все представленные в этом формате числа считаются лишь дополнительным текстом.

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

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

При этом меня совсем не удивляет, что XML популярен в бизнесе. Причина этого именно в том, что формат документов (на бумаге) понятен и привычен для бизнеса, и там хотят продолжать пользоваться знакомой и понятной моделью. По той же самой причине в бизнесе слишком часто используют документы в PDF вместо более удобных для машинной обработки форматов — потому что они по-прежнему привязаны к понятию печатной страницы с определенным физическим размером. Это касается даже тех документов, которые вряд ли когда-нибудь будут распечатываться (например, PDF-файл документации реестра из 8000 страниц). С этой точки зрения использование XML в бизнесе по сути — проявление скевоморфизма. Людям понятна метафорическая идея печатной страницы ограниченного размера, и они понимают, как создавать бизнес-процессы на основе печатных документов. Если это ваш ориентир, документы без ограниченного физического размера, являющиеся машиночитаемыми — документы XML — представляют собой инновацию, являясь при этом знакомым и комфортным аналогом документа. Что не мешает им оставаться неверным и излишне скевоморфичным способом представления данных.

На сегодняшний день единственными известными мне схемами XML, которые я действительно могу назвать правильным применением этого формата, являются XHTML и DocBook.

Формат файла batlogo.xml

Файл batlogo.xml предназначен для настройки собственной заставки (сплеш-скрин), показваемой при старте программы.

Готовые примеры вы можете найти на тематических сайтах, посвящённой программе — например на сайте http://www.nobat.ru/

 

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

 

Этот файл должен быть в обычном XML-формате с требуемой структурой. Структура XML-файла должна иметь главный раздел batlogo:

 

<batlogo>

</batlogo>

 

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

В тексте можно вставлять комментарии в стиле XML, например:

 

<!—

Здесь может располагаться ваш комментарий

—>

 

Внутри раздела batlogo могжет находиться необязательный элемент about (описание или название заставки), например:

 

<about> Заставка «Альфа» для программы The Bat! </about>

 

Внутри главного раздела должен находиться хотя бы один подраздел region в следующем примерном формате:

 

<region id=»bat»>

<node x=»1″ y=»1″/>

<node x=»1″ y=»288″/>

<node x=»448″ y=»288″/>

<node x=»448″ y=»1″/>

<node x=»1″ y=»1″/>

</region>

 

Этот раздел описывает форму показываемого окна.

Каждый элемент node описывает точку в замкнутой ломаной линии, формирующей многоугольную фигуру заставки (внешний периметр).

Параметр region -> id определяет уникальный код для этой фигуры.

Параметр node -> x определяет горизонтальную координату в точке.

Параметр node -> y определяет вертикальную координату в точке.

 

Вышеуказанный пример определяет прямоугольник шириной 448 пикселей и высотой 288 пикселей.

 

Также в главном разделе должен быть хотя бы один подраздел splash, который описывает графическое наполнение формы. Пример:

 

<splash region=»bat»>

<background>

  <choice file=»bk3.jpg» />

  <filechoice file=»bk*.jpg» />

</background>

 

<skin file=»logo. png» />

<vericon x=»390″ y=»180″ />

<regto x=»281″ y=»195″ font=»MS Shell Dlg» size=»-12″ color=»#E0E1FD» />

<regname x=»281″ y=»212″ font=»MS Shell Dlg» size=»-12″ color=»#E0E1FD» />

<unreg x=»5″ y=»270″ font=»MS Shell Dlg» size=»-12″ color=»#FF0000″ />

<version x=»281″ y=»154″ font=»MS Shell Dlg» size=»-12″ color=»#E0E1FD» />

</splash>

 

Обозначения элементов и параметров раздела:

background - подраздел, описывающий фоновые изображения заставки

choice — выбор одиночного файла для заставки

filechoice - выбор по маске файлов для заставки

skin - основное изображение заставки

vericon - иконка версии

regto - подпись для регистрации

regname — имя зарегистрированного пользователя

unreg - надпись для незарегистрированной версии

version - информация о версии

splash -> region — код формы окна

file — имя файла для изображения

x - горизонтальная позиция надписи в пикселях

y - вертикальная позиция надписи в пикселях

font — шрифт для надписи

size — размер шрифта для надписи

color — цвет шрифта для надписи

 

Примечание: в элементе splash можно использовать дополнительный параметр time в формате:

 

<splash region=»bat» time=»8:00-20:00″>

 

Здесь можно задать время для используемой заставки, и таким образом настроить разные заставки для разных времён суток

 

 

Примечание: Элемент version может быть заменён на расширенную версию:

 

<versionex x=»281″ y=»154″ font=»MS Shell Dlg» size=»-12″ color=»#E0E1FD» />

 

 

Смотрите также:

Пример файла batlogo. xml

 

XML Schema (XML схема) — описание структуры XML-документов. Создаём XML-файл Пример простой схемы XML

Порой понимание XML файла, отправляемого в кадастровую палату просто необходимо, когда чувствуешь, что надо, где то, что то исправить, да и природное любопытство у многих развито. Но… Важно . Помните, что после подписания файла ЭЦП, редактировать XML файл нельзя! Как пример из практике, при разделе участка на 300 ЗУ, девушка случайно стерла у одного из участков в адресе всего одну строчку. И все.. XML файл не проходил проверку. Искать в программе листая все записи показалось мне утомительным, тем более я знал что искать. Открыв XLM файл в тестовом редакторе поиском я нашел нужную строку и внес изменения. Но опять же повторюсь – если Вы отредактировали файл то его нужно снова переподписать ЭЦП. Итак, приступим. Я буду представлять рисунки и делать описание к ним.

И еще одно отступление, для редактирования и удобного просмотра XML файлов я рекомендую использовать программу . Она позволит Вам увидеть структуру файла и удобно раскрасит его по значениям. Для примера я возьму электрический полотенцесушитель для ванной , ну конечно же не его -), а файл XML образование 2 ЗУ путем выдела в счет доли в праве общей собственности на ЗУ с кадастровым номером….
Для примера, я сначала приведу рисунок свернутого XML файла с одним свернутым блоком.

Итак, судя по счетчику строк, расположенного слева, мы имеем файл в 336 строк. Как видно из рисунка блок Свернут, значок плюс справа. Поэтому я опишу сначала построчно то, что видно из данного рисунка, а потом разберем блоки входящие в блок Так как он самый объемный.

Мы не будем рассматривать весь файл построчно, а рассмотрим лишь те строки в которые вносятся наши данные.

3 строка : CodeType=”014″ – вид работ, их всего два как в нашем случае – образование и “015” – уточнение. Version=”03″ – версия XML файла. GUID (Globally Unique Identifier) — статистически уникальный 128-битный идентификатор, в нашем случае наименование файла должно совпадать с этим индикатором.
4 строка : Данные организации в которой работает кадастровый инженер, или данные самого кадастрового инженера.
5 строка : Код организации получателя, в данном случае Управление Федеральной службы государственной регистрации, кадастра и картографии по Республике Татарстан.

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

В принципе открывая файл в Notepad++ становится понятна вся структура XML файла. – Расположение – содержит в себе адрес. Значение в пишется когда части адреса нет к КЛАДР.

Пример XML файла карты плана сформированного в программном продукте Полигон Карта план

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

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

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

Сам по себе XML — это язык разметки, чем-то похожий на HTML, который используется на веб-страницах. Но если последний применяется только для вывода информации и её правильной разметки, то XML позволяет её структурировать определённым образом, что делает этот язык чем-то похожим на аналог базы данных, который не требует наличия СУБД.

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

Способ 1: Visual Studio

Вместо этого редактора кода от Microsoft можно использовать любой его аналог от других разработчиков. По факту Visual Studio является более расширенной версией обычного «Блокнота» . Код теперь имеет специальную подсветку, ошибки выделяются или исправляются автоматически, также в программу уже загружены специальные шаблоны, которые позволяют упростить создание XML-файлов больших объёмов.

Для начала работы вам нужно создать файл. Нажмите по пункту «Файл» в верхней панели и из выпадающего меню выберите «Создать…» . Откроется список, где указывается пункт «Файл» .

  • Вас перебросит в окно с выбором расширения файла, соответственно выбирайте пункт «XML-файл» .
  • В только что созданном файле уже будет первая строка с кодировкой и версией. По умолчанию прописана первая версия и кодировка UTF-8 , которые вы можете поменять в любое время. Дальше для создания полноценного XML-файла вам нужно прописать всё то, что было в предыдущей инструкции.

    По завершении работы снова выберите в верхней панели «Файл» , а там из выпадающего меню пункт «Сохранить всё» .

    Способ 2: Microsoft Excel

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

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


    Способ 3: Блокнот

    Для работы с XML вполне подойдёт даже обычный «Блокнот» , однако пользователю, который не знаком с синтаксисом языка, придётся трудно, так как в нём нужно прописывать различные команды и теги. Несколько проще и значительно продуктивнее процесс будет идти в специализированных программах для редактирования кода, например, в Microsoft Visual Studio. В них есть специальная подсветка тегов и всплывающие подсказки, что значительно упрощает работу человеку, плохо знакомому с синтаксисом этого языка.

    Для этого способа не потребуется что-либо скачивать, так как в операционную систему уже встроен «Блокнот» . Давайте попробуем сделать в нём простую XML-таблицу по данной инструкции:


    Примерно так у вас должен выглядеть готовый результат:




    25True


    XML-компиляторы должны обработать этот код в виде таблицы с одной колонкой, где указаны данные о неком Иване Иванове.

    В «Блокноте» вполне можно сделать несложные таблицы наподобие этой, но при создании более объёмных массивов данных могут возникнуть сложности, так как в обычном «Блокноте» нет функций исправления ошибок в коде или их подсветки.

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

    В этой главе будет показано, как писать XML схемы. Также вы узнаете, что схемы можно писать разными способами.

    XML документ

    Давайте посмотрим на следующий XML документ под названием «shiporder.xml»:

    John SmithOla Nordmann

    Langgt 23
    4000 StavangerNorwayEmpire BurlesqueSpecial Edition110.90Hide your heart19.90

    Приведенный выше XML документ состоит из корневого элемента shiporder с обязательным атрибутом orderid . Элемент shiporder содержит три дочерних элемента: orderperson , shipto и item . Элемент item используется дважды и содержит элемент title , необязательный элемент note , а также элементы quantity и price .

    Строка xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» говорит XML парсеру, что этот документ должен быть проверен на соответствие схеме. Строка xsi:noNamespaceSchemaLocation=»shiporder.xsd» указывает, где именно находится схема (в данном случае она находится в той же папке, что и файл «shiporder. xml»).

    Создание XML схемы

    Теперь для приведенного выше XML документа создадим XML схему.

    Создадим новый файл, который назовем «shiporder.xsd». Для создания XML схемы будем просто следовать за структурой XML документа и определять каждый встреченный элемент. Начнем со стандартной XML декларации, за которой опишем элемент xs:schema , который и определяет саму схему:

    Здесь мы используем стандартное пространство имен (xs ) и URI, ассоциированный с этим пространством имен, который имеет стандартное значение http://www.w3.org/2001/XMLSchema .

    Теперь мы должны определить элемент shiporder . У этого элемента есть атрибут, и он содержит другие элементы, поэтому мы рассматриваем его как элемент составного типа. Определения дочерних элементов элемента shiporder поместим в декларацию xs:sequence , что задает жесткую последовательность подэлементов:

    Теперь определим элемент orderperson , который будет простого типа (так как он не содержит ни атрибуты, ни другие элементы). Его тип (xs:string ) имеет префикс пространства имен, ассоциированного с XML схемой, что указывает на использование предопределенного типа данных:

    Теперь нам нужно определить : shipto и item . Начнем с определения элемента shipto :

    При помощи схем мы можем определить любого элемента. В этом нам помогут атрибуты maxOccurs и minOccurs . Атрибут maxOccurs задает максимальное число вхождений элемента, а атрибут minOccurs задает минимальное число вхождений. По умолчанию значение обоих атрибутов равно 1.

    Теперь определим элемент item . Этот элемент может использоваться неограниченное число раз внутри элемента shiporder . Определить такую особенность элемента item позволяет присваивание атрибуту maxOccurs значения «unbounded» . Это означает, что элемент item может использоваться столько раз, сколько нужно автору документа. Обратите внимание, что элемент note опционален. Определим это установив атрибут minOccurs в нулевое значение:

    Теперь мы можем декларировать атрибут элемента shiporder . Поскольку это обязательный атрибут, используем определение use=»required» .

    Примечание: Атрибуты должны всегда декларироваться последними:

    Вот полный код файла схемы «shiporder.xsd»:

    Разделение схемы

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

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

    Ниже приводится новая компоновка файла схемы («shiporder.xsd»):

    Использование поименованых типов

    Третий способ компоновки схемы предполагает определение классов или типов, которые позволяют повторное использование определений элементов. Это становится возможным, если дать имена элементам simpleTypes и complexTypes , а затем указать на них при помощи атрибута type .

    Третий способ компоновки файла схемы («shiporder.xsd»):

    Элемент restriction указывает на то, что тип данных является производным от типов данных из пространства имен W3C XML Schema. Таким образом, следующий фрагмент кода означает, что значение элемента или атрибута должно быть строковым:

    Однако гораздо чаще элемент restriction используется для накладывания ограничений на элементы. Посмотрите на следующие строки из приведенной выше схемы:

    Этот фрагмент кода указывает, что значение элемента или атрибута должно быть строковым, ровно шесть символов в длину, и этими символами должны быть цифры от 0 до 9.

    Для всех примеров ниже использован стандарт языка XSL. Широко применяется также более современная модификация этого стандарта — язык XSLT , детальнее про который можно прочитать в \xml\XSLTutorial или MSDN.

    Рассмотрим простой пример XML-файла (ex01.xml). Этот и остальные примеры можно найти в папке \xml\ XSLTForBeginers на диске.



    «Заметки об XSL»

    Если мы откроем этот файл в браузере Internet Explorer, то увидим тот же самый текст, который приведен выше, вместе со всеми тегами и служебной информацией. Но нам не нужны теги и служебная информация! Мы хотим видеть только ту информацию, которая относится к делу, а при помощи тегов — управлять внешним видом этой информации. Эта задача решается легко и просто: необходимо к XML-файлу добавить шаблон преобразования — XSL-файл.

    Перепишем наш XML-файл в следующем виде (ex01-1.xml).




    «Заметки об XSL»

    И создадим XSL-файл ex01-1.xsl. Текст файла приведен ниже.

    Если мы теперь откроем файл ex01-1.xsl в браузере Internet Explorer, то мы увидим, что наша задача решена, — на экране осталась только необходимая нам информация, все теги исчезли. Результат, который вы получите на экране браузера, приведен ниже.

    «Заметки об XSL»

    Легко также увидеть, что порядок вывода строк у нас определяется только содержанием шаблона преобразования — XSL-файла. При необходимости шаблон можно легко поменять, абсолютно не меняя наш основной XML-файл.

    Перепишем XML-файл. Информационную часть изменять не будем, а шаблон укажем другой ex01-2.xml.




    «Заметки об XSL»

    Создадим XSL-файл ex01-2.xsl. Текст файла приведен ниже.

    Если мы теперь откроем файл ex01-2.xsl в браузере Internet Explorer, то результат будет другим.

    «Заметки об XSL»

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

    Первый способ требует трудоемкого программирования, второй способ значительно увеличивает нагрузку на сервер базы данных, производительность которого часто является узким местом системы, — пользователю всегда хочется получать результаты быстрее.

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

    Есть и еще одно соображение, которое может быть существенным для разработчиков баз данных. Большинство современных СУБД могут форматировать результаты запроса к базе данных в виде XML-файла. То есть при построении интерфейса пользователя в рамках технологии XML и XSL мы добиваемся определенной независимости от поставщика СУБД. В части организации вывода — практически полной независимости. А эта часть весьма велика в большинстве прикладных систем, ориентированных на работу с базами данных. Конечно, помимо вывода есть еще ввод и серверная обработка бизнес-логики, но здесь вам придется искать какие-то иные решения.

    Первые шаги

    Разберем теперь более подробно первый пример. Напомним его текст.



    «Заметки об XSL»

    Первая строка информирует браузер о том, что файл имеет формат XML. Атрибут version является обязательным. Атрибут encoding не является обязательным, но если у вас в тексте есть русские буквы, то необходимо вставить этот атрибут, в противном случае XML-файл просто не будет обрабатываться, — вы получите сообщение об ошибке.

    Следующие строки — это тело XML-файла. Оно состоит из элементов, которые в совокупности образуют древовидную структуру. Элементы идентифицируются тегами и могут быть вложены друг в друга.

    Элементы могут иметь атрибуты, значения которых тоже могут обрабатываться в соответствии с шаблоном.

    На верхнем уровне XML-файла всегда находится один элемент. То есть файл вида



    «Заметки об XSL»



    «Введение в CSP»

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




    «Заметки об XSL»



    «Введение в CSP»


    Отметим, что имена тегов чувствительны к регистру символов. Подробнее об этом можно прочесть в любой книге по XML — элементам и атрибутам в этих книгах уделяется достаточно большое внимание.

    Перейдем теперь к шаблону преобразования — к XSL-файлу. Задача XSL-файла — преобразовать дерево XML-файла в другое дерево, которое, например, будет соответствовать формату HTML и может быть изображено на экране браузера с учетом форматирования, выбора шрифтов и т. п.

    Для того, чтобы браузер выполнил необходимое преобразование, нужно в XML-файле указать ссылку на XSL-файл

    Рассмотрим теперь текст XSL-файла

    Первая строка файла содержит тег элемента xsl:stylesheet. Атрибуты элемента — номер версии и ссылка на пространство имен. Эти атрибуты элемента xsl:stylesheet являются обязательными. В нашем случае пространство имен — это все имена элементов и их атрибутов, которые могут использоваться в XSL-файле. Для XSL-файлов ссылка на пространство имен является стандартной.

    Заметим, что XSL-файл является одной из разновидностей XML-файлов. Он не содержит пользовательских данных, но формат его тот же самый. Файл содержит элемент верхнего уровня xsl:stylesheet, а далее идет дерево правил преобразования.

    В настоящем документе мы не будем подробно пояснять, что означает каждый элемент XSL-файла. Мы будем приводить различные примеры и показывать результат в каждом примере, что даст возможность самостоятельно сопоставить различные элементы XSL-файла и инициируемые этими элементами преобразования исходного XML-файла с пользовательской информацией. Заметьте также, что значение атрибута select и подобных со смыслом «выбрать» записывается на специальном языке XPath , о котором можно прочитать в кратце на диске \xml\XPathTutorial, а подробнее в MSDN.

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

    В первом примере мы посмотрели, как с помощью элемента xsl:value-of можно вывести в HTML-формате содержание элемента (текст, заключенный между тегами). Теперь мы посмотрим, как при помощи того же самого элемента можно вывести значение атрибута элемента.

    Рассмотрим следующий XML-файл ex02-1.xml

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

    Чтобы оценить преимущество XML схем (XML Schema) перед DTD, давайте более подробно рассмотрим основные недостатки DTD, которые с успехом были исправлены в XML схемах. О них я уже упоминал в статье « », но для лучшего понимания давайте повторим.

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

    Это были основные недостатки XML DTD, которые с успехом исправлены в промышленном стандарте описания XML-документов XML Schema.

    XML Schema – промышленный стандарт описания XML-документов

    Если быть кратким, то XML Schema делает следующее:

    1. Описывает названия элементов и атрибутов (словарь).
    2. Описывает взаимосвязь между элементами и атрибутами, а также их структуру (модель содержания).
    3. Описывает типы данных.

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

    Пример XML Schema для валидации XML-документа

    Как показывает практика, материал намного лучше усваивается, если сразу начинать изучение с примеров. Сразу скажу, что углубляться во все тонкости мы не будем, так как материал очень сложный, особенно если изучать его в текстовом виде.

    Пример простой схемы XML

    При помощи данной схемы можно проверить XML-документ следующего содержания.

    Основы XMLназвание> 300цена> книга>

    Итак, вернемся к нашей XML схеме. Как вы уже заметили, для создания XML схем используется уже известный нам XML. Единственное отличие здесь в том, что в XML Schema уже определены элементы, в отличие от обычного XML. В связи с этим используются пространства имен. В данном случае обязательным пространством имен будет «http://www.w3.org/2001/XMLSchema», которое будет задаваться при помощи префиксов «xs».

    Сразу хочу заметить, что можно использовать как префиксы пространств имен, так и задавать пространство имен для корневого элемента. Как таковой разницы здесь нет. Каждый сам решает, как ему поступать в данной ситуации. Скажу только, что обычно используются префиксы «xs» или «xsd».

    Ну а теперь давайте разберемся, как же расшифровать вышеприведенную схему. Как уже говорилось выше, XML Schema это описание словаря и типов данных. Отталкиваясь от этого, произведем расшифровку каждого элемента.

    • — объявляем элемент «книга» с типом «Книга».
    • — объявляем комплексный тип с именем «Книга» (xs:complexType – может содержать в себе вложенные элементы).
    • — объявление вложенности. То есть, тип будет содержать вложенные элементы.
    • — объявляем элемент с именем «название» (стандартного типа «строка» — xs:string).
    • — объявляем элемент с именем «цена» (стандартного типа «число» — xs:decimal).

    Как видите, ничего сверхсложного здесь нет. Если вдуматься, то все очень просто.

    Основные элементы XML Schema

    Если быть кратким, то XML схему можно описать следующим образом.

    Ваша схема …

    Как видно с примера, каждая XML схема состоит с корневого элемента «schema» и обязательного пространства имен «http://www.w3.org/2001/XMLSchema». Далее идет описание схемы и собственно сама схема. При этом очень часто в очень качественных схемах описание бывает куда большим, чем сама XML Schema.

    Описание элементов в XML Schema

    В начале статьи мы уже рассмотрели пример простейшей XML схемы. В ней мы отдельно описывали элементы и типы. При этом сразу хочу заметить, что последовательность здесь не играет роли. Схема будет работать в любом случае.

    Теперь давайте рассмотрим второй способ написания XML Schema, который основывается на том, чтобы описывать тип сразу внутри элемента. Данный способ подойдет в том случае, если вы не планируете использовать одно и то же описание для разных элементов. Для наглядности рассмотрим пример.

    Как видно с примера, элемент объявляется при помощи специальной конструкции «element» с использованием соответствующего префикса. В данном случае мы определяем элемент с названием «root» без указания типа (type), так как он будет описан внутри элемента. То есть, есть два способа описания элементов.

    1 способ

    Описание типа

    2 способ

    Описание типа элемента

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

    Далее после объявления элемента мы указываем, что он комплексного типа () и перечисляем () вложенные элементы. В данном случае это элементы name и age с типами «xs:string» и «xs:integer». Префикс xs означает, что это базовый тип, который уже описан в стандарте XML Schema.

    Как видите, пока все довольно просто. Опять же, углубляться во все подробности мы не будем, так как данная статья предназначена для ознакомления с XML Schema, а не ее детальным изучением.

    Как ставится в соответствие XML Schema и документ

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

    На случай, если обработчик не знает где лежит схема, мы можем указать, где ее искать. Делается это при помощи специального атрибута «schemaLocation». Поскольку этот атрибут принадлежит другому пространству имен, то перед началом использования атрибута пространство тоже нужно указать. Для наглядности рассмотрим пример.

    XML Schema

    XML-документ

    Теперь давайте подробно разберем каждую строчку.

    • targetNamespace=»http://www.site.com» – указываем для какого пространства имен эта XML Schema.
    • xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance» – подключаем пространство имен в котором описан атрибут «schemaLocation».
    • xsi:schemaLocation=»http://www.site.com/product.xsd» – указываем, где можно найти схему на случай, если парсер не знает где она лежит. Если XML-документ не принадлежит никакому пространству имен, а следовательно и в схеме нет на него указания, то атрибут «schemaLocation» заменяется на «noNamespaceSchemaLocation» (указание на схему без определения пространств имен).

    На этом все. Удачи вам и успехов в изучении XML!

    Учебное пособие по XML — Введение, структура и правила синтаксиса

    В этом руководстве мы познакомимся с форматом обмена данными XML и обсудим структуру документа XML и правила синтаксиса для XML.

    Что такое XML?

    • XML (расширяемый язык разметки) — это язык разметки, подобный HTML, для хранения или передачи данных.
    • XML широко используется в веб-службах для передачи данных по сети.
    • XML не имеет предопределенных тегов, в отличие от HTML.
    • XML очень легко анализировать и генерировать.
    • XML обеспечивает надежную поддержку символов Unicode. Кодировка символов по умолчанию — UTF-8 для XML-документов.
    • XML определяет набор правил кодирования документов в удобном для человека формате.
    • XML широко используется в SOA (сервисно-ориентированной архитектуре).
    • XML-файлы имеют расширение .xml , а типы мультимедиа XML: application/xml и text/xml .
    • Почти все основные языки программирования поддерживают XML из-за его независимого от языка формата данных.

    Структура XML-документа:

    1. XML-документ содержит только один корневой элемент: начальный тег XML-документа, и он содержит все остальные элементы.

      1

      2

      3

      4

      5

      6

      7

      8

      10

      11

      <Подраздел>

      <Подраздел>

      <Раздел>

              

          

    2. XML-документы могут начинаться с пролога, стоящего перед корневым элементом. Он содержит метаданные о XML-документе, такие как кодировка символов, структура документа и таблицы стилей. Например,

    3. Тег в XML — это чувствительная к регистру конструкция разметки, которая начинается с < и заканчивается > . Тег может быть:
      • Начальный тег, например <имя>
      • Конечный тег, например
      • Тег пустого элемента, например
    4. Элемент в XML состоит из символов между начальным и конечным тегами. Например, Джон Сноу . Он также может состоять только из тега пустого элемента. Например, <имя/> .
    5. Элементы XML могут иметь атрибуты, существующие в начальном теге или теге пустого элемента.
      Атрибут состоит из пары "имя-значение". Например,

      screenshot

      Здесь имена атрибутов src и alt 9`{|}~ , ни символ пробела, и не может начинаться с - , . или номер.

    6. Символы < и и имеют особое значение в XML. Они являются ключевыми синтаксическими символами и не должны использоваться в элементе за пределами раздела CDATA .

       
      XML предоставляет средства escape для обработки этих специальных символов. Например:

      • < представляет <
      • & представляет и

      В XML есть еще три предопределенных объекта:

      • > представляет >
      • ' представляет '
      • " представляет "
    7. Документ XML не может содержать пробелов перед объявлением XML; в противном случае он будет рассматриваться синтаксическим анализатором как инструкция по обработке. Процессоры XML сохраняют все пробелы в содержимом элемента, а все пробелы в значениях атрибутов представляются как одиночные пробелы.
    8. Подобно HTML, комментарий в XML начинается с .

    Это все о формате обмена данными XML, структуре XML и правилах синтаксиса XML.

     
    Полезные ссылки: XML Validator, XML Formatter, XML Minifier, XML to JSON Converter

    Оцените этот пост

    Средняя оценка 4.5/5. Количество голосов: 10

    Голосов пока нет! Будьте первым, кто оценит этот пост.

    Сожалеем, что этот пост не был вам полезен!

    Расскажите, как мы можем улучшить этот пост?

    Спасибо за внимание.

    Пожалуйста, используйте наш онлайн-компилятор для публикации кода в комментариях с использованием C, C++, Java, Python, JavaScript, C#, PHP и многих других популярных языков программирования.

    Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂


    Структура индексного файла XML

    Структура индексного файла XML

    PReS™ Image создает стандартный XML-файл в кодировке UTF-8 со следующей структурой и содержимым

    Имя:

    Значение:

    Содержимое каждого сгенерированного файла XML содержит теги Pdi. Это указывает на то, что источником вложенного XML-контента является PlanetPress Suite.

    <Заголовок>

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

    <ИмяФормы>

    Имя преобразованного документа (в папке «Документы рабочего процесса PReS™»), действие Digital Action, выполненное для создания этого XML-файла и связанного с ним PDF-файла или другого типа выходного изображения.

    <Архивный файл>

    Имя этого XML-файла (и соответствующего ему выходного файла Digital Action) без расширения имени файла. Вы задаете это имя в рабочем процессе PReS™ при настройке задачи действия Digital Action.

    <Время>

    Время, когда задача действия Digital Action создала этот XML-файл, выражается как часов : минут : секунд.

    <Дата>

    День, когда задача действия Digital Action создала этот файл XML, выраженный как год / месяц / день .

    <Метод архивации>

    Формат, выбранный для Типа вывода в диалоговом окне свойств действия Digital Action (PDF, JPEG, различные варианты TIFF).

    <Поля>

    Эти теги окружают все поля, используемые в документе. Каждое поле представляет собой отдельный элемент указателя, определенный для объекта выбора данных в PlanetPress Design.

    <Поле>

    Эти теги окружают каждое поле, используемое в документе. Каждое поле содержит теги для своего имени и размера, соответствующего количеству ячеек, содержащих выборку данных, сделанную в PlanetPress Design.

    <Имя>

    Имя индексного термина, определенное для документа с переменным содержимым, созданного в PlanetPress Design.

    <Размер>

    Длина выборки данных, которую вы создали для этого индекса в PlanetPress Design. Если вы использовали многострочный выбор, здесь отображается количество всех выбранных ячеек.

    <Номер>

    Номер страницы файла PDF, TIFF или JPEG, созданного из одного задания. Файлы JPEG и TIFF разделяются на отдельные файлы, если они являются многостраничными заданиями; каждое задание по-прежнему содержится в одном индексном XML-файле, разделенном на страницы.

    <Страница>

     

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

    <Страницы>

     

    Эти теги охватывают все страницы задания. Они появляются после информации в заголовке файла XML.

    xsd - Как документировать структуру файлов XML

    Экспериментируя с различными языками схем XML, я пришел к выводу, что RELAX NG лучше всего подходит для большинства случаев (рассуждения в конце).

    Требования

    • Разрешить документирование структуры документа XML
    • Делайте это в удобочитаемой форме
    • Будьте проще для автора

    Измененный образец XML (doc.xml)

    Я добавил один атрибут, чтобы также проиллюстрировать этот тип структуры в документации.

     
        
            
            
        
        <метка>
            
            
        
    
     

    Использовать синтаксис RELAX NG Compact с комментариями (schema.rnc)

    RELAX NG позволяет описать образец структуры XML следующим образом:

     пуск =
    ## Контейнер для одного объекта
    элемент objectRoot {
        ## дата и время создания объекта
        атрибут создан {xsd:dateTime},
        ## Текущая версия объекта из репозитория
        ## Вхождение 1 предполагается по умолчанию
        элемент v {
            текст
        },
        ## Имя объекта из репозитория
        ## Примечание: вхождение обозначается "*" и означает 0 или более
        метка элемента {
            текст
        }*
    }
     

    Думаю, очень сложно превзойти простоту, сохранив заданный уровень выразительности.

    Как прокомментировать структуру

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

    • очевидный факт: встроенные XML-комментарии в doc.xml не имеют значения, учитывается только то, что находится в schema.rnc .

    Если требуется XML-схема 1.0, создайте ее (schema.xsd)

    Если у вас есть инструмент (с открытым исходным кодом) под названием trang , вы можете создать файл XML-схемы следующим образом:

     $ trang schema.rnc схема.xsd
     

    Результирующая схема выглядит следующим образом:

     
    
      
        
          Контейнер для одного объекта
        
        
          
            
            
          
          
            
              дата и время создания объекта
            
          
        
      
      
        
          Текущая версия объекта из репозитория
    Вхождение 1 предполагается по умолчанию
        
      
      
        
          Имя объекта из репозитория
    Примечание: вхождение обозначается "*" и означает 0 или более
        
      
    
     

    Теперь ваши клиенты, настаивающие на использовании только XML-схемы 1. 0, могут использовать вашу спецификацию XML-документа.

    Проверка doc.xml на соответствие schema.rnc

    Существуют инструменты с открытым исходным кодом, такие как jing и rnv , поддерживающие синтаксис RELAX NG Compact и работающие как в Linux, так и в MS Windows.

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

    Использование jing:

     $ jing -c schema.rnc doc.xml
     

    Значение -c важно, jing по умолчанию предполагает RELAX NG в форме XML.

    Использование rnv для проверки правильности самого schema.rnc :

     $ rnv -c schema.rnc
     

    и для проверки doc.xml :

     $ rnv schema.rnc doc.xml
     

    rnv позволяет одновременно проверять несколько документов:

     $ rnv schema.rnc doc.xml otherdoc.xml Anotherone.xml
     

    RELAX NG Компактный синтаксис — плюсы

    • очень читабельно, даже новичок должен понять текст
    • прост в освоении (RELAX NG поставляется с хорошим учебным пособием, большую часть которого можно изучить за один день)
    • очень гибкий (несмотря на то, что он выглядит простым, он охватывает многие ситуации, некоторые из них даже не могут быть разрешены XML-схемой 1.