Введение
Язык разметки W3C для кодирования данных. Extensible Markup Language (XML) – это язык разметки и формат файла для хранения, передачи и восстановления произвольных данных. Он определяет набор правил для кодирования документов в формате, который легко читается как человеком, так и машиной. XML 1.0 Specification, разработанная Консорциумом Всемирной паутины в 1998 году, и несколько других связанных спецификаций – все они являются бесплатными открытыми стандартами – определяют XML. Цели разработки XML заключаются в простоте, универсальности и удобстве использования в Интернете. Это текстовый формат данных с мощной поддержкой Unicode для различных человеческих языков. Несмотря на то, что XML изначально разрабатывался для документов, язык широко используется для представления произвольных структур данных, например, в веб-сервисах. Существует несколько систем схем, облегчающих определение языков на основе XML, а программисты разработали множество интерфейсов прикладного программирования (API) для обработки данных XML.
Extensible Markup Language (XML) is a markup language and file format for storing, transmitting, and reconstructing arbitrary data. It defines a set of rules for encoding documents in a format that is both human readable and machine readable. The World Wide Web Consortium's XML 1.0 Specification of 1998 and several other related specifications—all of them free open standards—define XML. The design goals of XML emphasize simplicity, generality, and usability across the Internet. It is a textual data format with strong support via Unicode for different human languages. Although the design of XML focuses on documents, the language is widely used for the representation of arbitrary data structures, such as those used in web services. Several schema systems exist to aid in the definition of XML based languages, while programmers have developed many application programming interfaces (APIs) to aid the processing of XML data.
Обзор
Основная цель XML — сериализация, то есть хранение, передача и восстановление произвольных данных. Для обмена информацией между различными системами необходимо согласовать формат файла. XML стандартизирует этот процесс и, таким образом, является аналогом лингва франка для представления информации. Как язык разметки, XML помечает, категоризирует и структурирует информацию, включая RSS, Atom, Office Open XML, OpenDocument, SVG, COLLADA и XHTML. XML также служит базовым языком для протоколов связи, таких как SOAP и XMPP. Он является одним из форматов обмена сообщениями, используемых в технике программирования Asynchronous JavaScript и XML (AJAX). Многие отраслевые стандарты данных, такие как Health Level 7, OpenTravel Alliance, FpML, MISMO и National Information Exchange Model, основаны на XML и широких возможностях спецификации XML-схемы. В издательском деле архитектура типизации информации Дарвина (Darwin Information Typing Architecture) является отраслевым стандартом данных на основе XML. XML широко используется для поддержки различных издательских форматов. Одно из применений XML — передача оперативной метеорологической информации (OPMET) в соответствии со стандартами IWXXM.
Персонажи и побег
Документы XML состоят целиком из символов репертуара Unicode. За исключением небольшого числа конкретно исключенных управляющих символов, любой символ, определенный стандартом Unicode, может встречаться в содержимом документа XML. XML предоставляет средства для определения кодировки символов Unicode, составляющих документ, и для представления символов, которые по тем или иным причинам не могут быть использованы напрямую.
Обнаружение кодирования
Набор символов Unicode может быть закодирован в байты для хранения или передачи различными способами, называемыми "кодировками". Сам Unicode определяет кодировки, охватывающие весь репертуар символов; хорошо известные из них – UTF-8 (который стандарт XML рекомендует использовать без BOM) и UTF-16. Существует множество других текстовых кодировок, предшествовавших Unicode, таких как ASCII и различные ISO/IEC 8859; репертуары символов этих кодировок во всех случаях являются подмножествами набора символов Unicode. XML допускает использование любой из кодировок, определенных в Unicode, а также любых других кодировок, символы которых также представлены в Unicode. XML также предоставляет механизм, позволяющий процессору XML надежно определить используемую кодировку без каких-либо предварительных знаний. Кодировки, отличные от UTF-8 и UTF-16, не всегда распознаются всеми XML-анализаторами (и в некоторых случаях даже UTF-16, хотя стандарт предписывает его обязательную поддержку).
Синтаксическая правильность и обработка ошибок
Спецификация XML определяет XML-документ как хорошо сформированный текст, что означает, что он соответствует списку правил синтаксиса, представленных в спецификации. Некоторые ключевые моменты в довольно длинном списке включают: документ содержит только правильно закодированные допустимые символы Unicode. Ни один из специальных синтаксических символов, таких как < и &, не появляется, за исключением случаев выполнения их функций разграничения разметки. Начальный, конечный и пустой тег элементов, ограничивающих элементы, правильно вложены, без пропусков и перекрытий. Имена тегов чувствительны к регистру; начальный и конечный теги должны совпадать точно. Имена тегов не могут содержать символы ! "#$%&' *+,/;<=>? @[\]^`{|}~, а также пробел и не могут начинаться с " ", ". " или числовой цифры. Один корневой элемент содержит все остальные элементы. Определение XML-документа исключает тексты, содержащие нарушения правил хорошо сформированности; они просто не являются XML. XML-процессор, обнаруживший такое нарушение, обязан сообщить об ошибке и прекратить нормальную обработку. Эта политика, иногда называемая "жесткой обработкой ошибок", резко контрастирует с поведением программ, обрабатывающих HTML, которые разработаны для получения разумного результата даже при наличии серьезных ошибок разметки. Политика XML в этой области подверглась критике как нарушение закона Постеля ("Будьте консервативны в отправляемых данных; будьте снисходительны к принимаемым данным"). Спецификация XML определяет допустимый XML-документ как хорошо сформированный XML-документ, который также соответствует правилам определения типа документа (DTD).
The document contains only properly encoded legal Unicode characters. None of the special syntax characters such as < and & appear except when performing their markup delineation roles. The start tag, end tag, and empty element tag that delimit elements are correctly nested, with none missing and none overlapping. Tag names are case sensitive; the start tag and end tag must match exactly. Tag names cannot contain any of the characters ! "#$%&' *+,/;<=>? @[\]^`{|}~, nor a space character, and cannot begin with " ", ". ", or a numeric digit. A single root element contains all the other elements. The definition of an XML document excludes texts that contain violations of well formedness rules; they are simply not XML. An XML processor that encounters such a violation is required to report such errors and to cease normal processing. This policy, occasionally referred to as "draconian error handling", stands in notable contrast to the behavior of programs that process HTML, which are designed to produce a reasonable result even in the presence of severe markup errors. XML's policy in this area has been criticized as a violation of Postel's law ("Be conservative in what you send; be liberal in what you accept"). The XML specification defines a valid XML document as a well formed XML document which also conforms to the rules of a Document Type Definition (DTD).
Схемы и валидация
Кроме того, XML-документ может быть не только корректным, но и валидным. Это означает, что он содержит ссылку на определение типа документа (DTD), и его элементы и атрибуты объявлены в этой DTD и соответствуют грамматическим правилам, установленным в ней. XML-процессоры классифицируются как валидирующие или невалидирующие в зависимости от того, проверяют ли они XML-документы на валидность. Процессор, обнаруживший ошибку валидации, должен уметь сообщить о ней, но может продолжить нормальную обработку. DTD является примером схемы или грамматики. После первоначальной публикации XML 1.0 было проделано значительная работа в области языков схем для XML. Такие языки схем обычно ограничивают набор элементов, которые могут использоваться в документе, атрибуты, которые могут к ним применяться, порядок их следования и допустимые отношения родитель-потомок.
RELAX NG
RELAX NG (Regular Language for XML Next Generation) был изначально специфицирован организацией OASIS и теперь является стандартом (Часть 2: Валидация на основе регулярной грамматики ISO/IEC 19757 – DSDL). Схемы RELAX NG могут быть записаны либо в синтаксисе на основе XML, либо в более компактном синтаксисе, не использующем XML; эти два синтаксиса изоморфны, и инструмент преобразования Джеймса Кларка – Trang – позволяет конвертировать между ними без потери информации. RELAX NG имеет более простое определение и механизм валидации, чем XML Schema, что облегчает его использование и внедрение. Он также поддерживает использование подключаемых модулей для работы с типами данных; например, автор схемы RELAX NG может потребовать, чтобы значения в XML-документе соответствовали определениям, заданным в типах данных XML Schema.
Схематроны
Schematron — это язык для выражения утверждений о наличии или отсутствии определенных структур в XML-документе. Как правило, он использует XPath-выражения. Schematron теперь является стандартом (часть 3: проверка на основе правил ISO/IEC 19757 – DSDL).
DSDL и другие языки схем
DSDL (Document Schema Definition Languages) – это многочастный стандарт ISO/IEC (ISO/IEC 19757), объединяющий в себе комплексный набор небольших языков схем, каждый из которых предназначен для решения конкретных задач. DSDL включает синтаксисы RELAX NG полного и компактного вида, язык утверждений Schematron, а также языки для определения типов данных, ограничений набора символов, переименования и расширения сущностей, и маршрутизации фрагментов документов на основе пространств имен к различным валидаторам. Языки схем DSDL пока не имеют такой же поддержки со стороны производителей, как XML Schemas, и в определенной степени являются реакцией промышленных издателей на недостаточную применимость XML Schemas для целей публикации. Некоторые языки схем не только описывают структуру конкретного XML-формата, но и предоставляют ограниченные средства для воздействия на обработку отдельных XML-файлов, соответствующих этому формату. DTD и XSD обладают такой возможностью; они, например, могут обеспечивать расширение инфосета и значения атрибутов по умолчанию. RELAX NG и Schematron намеренно не предоставляют такие возможности.
Интерфейсы программирования
Цели проектирования XML включают в себя: "Обеспечить простоту написания программ, обрабатывающих документы XML". Примеры pull-парсеров включают Data::Edit::Xml в Perl, StAX в языке программирования Java, XMLPullParser в Smalltalk, XMLReader в PHP, ElementTree.iterparse в Python, SmartXML в Red, System.Xml.XmlReader в .NET Framework и DOM traversal API (NodeIterator и TreeWalker). Pull-парсер создает итератор, который последовательно обходит различные элементы, атрибуты и данные в XML-документе. Код, использующий этот итератор, может проверять текущий элемент (например, определять, является ли он начальным или конечным тегом, или текстом), и анализировать его атрибуты (локальное имя, пространство имен, значения атрибутов XML, значение текста и т. д.), а также может перемещать итератор к следующему элементу. Таким образом, код может извлекать информацию из документа по мере его обхода. Рекурсивный спуск обычно позволяет хранить данные в виде типизированных локальных переменных в коде, выполняющем разбор, в то время как SAX, например, обычно требует от парсера вручную поддерживать промежуточные данные в стеке элементов, являющихся родительскими для текущего разбираемого элемента. Код pull-парсинга может быть более понятным и простым в сопровождении, чем код SAX-парсинга.
Модель объекта документа
Document Object Model (DOM) — это API, позволяющий осуществлять навигацию по всему документу, как если бы он представлял собой дерево объектов-узлов, отражающих содержимое документа. Документ DOM может быть создан парсером или сгенерирован вручную пользователями (с некоторыми ограничениями). Типы данных в узлах DOM являются абстрактными, а реализации предоставляют собственные привязки, специфичные для языка программирования. Реализации DOM обычно требуют значительных затрат памяти, поскольку, как правило, весь документ должен быть загружен в память и представлен в виде дерева объектов до того, как будет разрешен доступ к нему.
Обязательность данных
Привязка XML-данных — это техника, упрощающая разработку приложений, которым необходимо работать с XML-документами. Она заключается в сопоставлении XML-документа с иерархией строго типизированных объектов, а не в использовании универсальных объектов, создаваемых DOM-парсером. Получаемый код зачастую легче читать и поддерживать, а также позволяет выявлять проблемы на этапе компиляции, а не во время выполнения. Привязка XML-данных особенно хорошо подходит для приложений, в которых структура документа известна и фиксирована на момент написания приложения. Создавая строго типизированное представление XML-данных, разработчики могут воспользоваться преимуществами современных интегрированных сред разработки (IDE), предоставляющих такие функции, как автозавершение, рефакторинг кода и подсветка синтаксиса. Это облегчает написание корректного и эффективного кода и снижает риск возникновения ошибок и дефектов. Примеры систем привязки данных включают в себя Java Architecture for XML Binding (JAXB), XML-сериализацию в .NET Framework и XML-сериализацию в gSOAP.
XML как тип данных
XML стал восприниматься как полноценный тип данных в других языках программирования. Расширение ECMAScript for XML (E4X) для языка ECMAScript/JavaScript явно определяет два специальных объекта (XML и XMLList) для JavaScript, которые поддерживают узлы XML-документов и списки XML-узлов как отдельные объекты и используют точечную нотацию для обозначения родительско-дочерних связей. E4X поддерживался браузерами Mozilla 2.5+ (хотя сейчас устарел) и Adobe ActionScript, но не получил широкого распространения. Аналогичная нотация используется в реализации LINQ от Microsoft для Microsoft .NET 3.5 и более поздних версий, а также в Scala (которая работает на Java VM). Приложение xmlsh с открытым исходным кодом предоставляет Linux-подобную оболочку со специальными возможностями для манипулирования XML и также рассматривает XML как тип данных, используя обозначение <[ ]>. Resource Description Framework определяет тип данных rdf:XMLLiteral для хранения заключенного в оболочку, канонического XML. Facebook разработал расширения для языков PHP и JavaScript (XHP и JSX соответственно), которые добавляют XML в основной синтаксис подобно E4X.
История
XML — это профиль приложения SGML (ISO 8879). Универсальность SGML для динамического отображения информации была осознана первыми издателями цифровых медиа в конце 1980-х годов, до появления Интернета. К середине 1990-х годов некоторые специалисты по SGML получили опыт работы с тогдашней новой Всемирной паутиной и считали, что SGML предлагает решения для некоторых проблем, с которыми Интернет, вероятно, столкнется по мере своего развития. Дэн Коннолли включил SGML в список направлений деятельности W3C, когда присоединился к штату в 1995 году; работа началась в середине 1996 года, когда инженер Sun Microsystems Джон Босак разработал устав и привлек соавторов. Босак поддерживал тесные связи в небольшом сообществе людей, имевших опыт работы как с SGML, так и с Интернетом. XML был разработан рабочей группой из одиннадцати человек при поддержке (примерно) 150-членной группы заинтересованных сторон. Технические дискуссии проходили в рассылке группы заинтересованных сторон, а вопросы решались путем достижения консенсуса или, в случае неудачи, большинством голосов рабочей группы. Запись принятых проектных решений и их обоснований была составлена Майклом Спербергом Маккуином 4 декабря 1997 года. Джеймс Кларк был техническим руководителем рабочей группы и внес значительный вклад, в частности, предложив синтаксис пустого элемента `<empty />` и название "XML". Среди других предложенных названий были "MAGMA" (Минимальная архитектура для обобщенных приложений разметки), "SLIM" (Структурированный язык для интернет-разметки) и "MGML" (Минимальный обобщенный язык разметки). Первоначальными соавторами спецификации были Тим Брей и Майкл Сперберг Маккуин. На полпути проекта Брей принял предложение о консультационных услугах от Netscape, что вызвало резкие протесты со стороны Microsoft. Брея временно попросили покинуть пост редактора. Это привело к ожесточенным спорам в рабочей группе, которые в конечном итоге были разрешены путем назначения Жана Паоли из Microsoft третьим соавтором. Рабочая группа XML общалась в основном по электронной почте и еженедельно проводила телеконференции. Основные проектные решения были приняты в короткий период интенсивной работы с августа по ноябрь 1996 года, когда был опубликован первый рабочий проект спецификации XML. Дальнейшая работа над дизайном продолжалась в 1997 году, и XML 1.0 получил статус Рекомендации W3C 10 февраля 1998 года.
1,0 и 1.1
Первый (XML 1.0) был изначально определен в 1998 году. С тех пор он претерпел незначительные изменения, не получив нового номера версии, и в настоящее время находится в своем пятом издании, опубликованном 26 ноября 2008 года. Он широко применяется и по-прежнему рекомендуется для общего использования. Второй (XML 1.1) был первоначально опубликован 4 февраля 2004 года, в тот же день, что и XML 1.0 Третье издание, и в настоящее время находится во втором издании, опубликованном 16 августа 2006 года. Он содержит функции (некоторые из которых являются спорными), предназначенные для упрощения использования XML в определенных случаях. Основные изменения заключаются в возможности использования символов окончания строки, применяемых на платформах EBCDIC, а также символов и письменности, отсутствующих в Unicode 3.2. XML 1.1 не получил широкого распространения и рекомендуется к использованию только тем, кому необходимы его специфические возможности. До выхода пятого издания XML 1.0 отличался от XML 1.1 более строгими требованиями к символам, допустимым в именах элементов и атрибутов, а также в уникальных идентификаторах: в первых четырех изданиях XML 1.0 символы перечислялись исключительно с использованием определенной версии стандарта Unicode (Unicode 2.0 – Unicode 3.2). Пятое издание заменяет механизм XML 1.1, который более устойчив к будущим изменениям, но снижает избыточность. Подход, принятый в пятом издании XML 1.0 и во всех изданиях XML 1.1, заключается в том, что в именах запрещены лишь определенные символы, а все остальные разрешены, чтобы обеспечить поддержку подходящих символов имен в будущих версиях Unicode. В пятом издании XML-имена могут содержать символы балийской, чамской или финикийской письменности, среди многих других, добавленных в Unicode после Unicode 3.2. Среди поддерживаемых управляющих символов в XML 1.1 – два кода переноса строки, которые должны рассматриваться как пробельные символы, и это единственные управляющие коды, которые можно записывать непосредственно.
2,0
Было обсуждение XML 2.0, хотя ни одна организация не объявляла о планах работы над таким проектом. XML SW (SW для "skunkworks"), написанный одним из первоначальных разработчиков XML, содержит ряд предложений относительно того, как может выглядеть XML 2.0, включая исключение DTD из синтаксиса, а также интеграцию пространств имен XML, XML Base и XML Information Set в основной стандарт.
МикроXML
В 2012 году Джеймс Кларк (технический руководитель рабочей группы по XML) и Джон Коуэн (редактор спецификации XML 1.1) создали Группу сообщества MicroXML в W3C и опубликовали спецификацию для существенно упрощенного подмножества XML.
Бинарный XML
В World Wide Web Consortium также действует Рабочая группа по бинарной характеристике XML, проводящая предварительные исследования вариантов применения и свойств бинарного представления набора информации XML. Рабочая группа не уполномочена разрабатывать официальные стандарты. Поскольку XML по определению является текстовым форматом, ITU-T и ISO используют название Fast Infoset для своего бинарного формата (ITU-T Rec. X.891 и ISO/IEC 24824-1), чтобы избежать путаницы.
Критика
XML и его расширения регулярно подвергаются критике за многословность, сложность и избыточность. Отображение базовой древовидной модели XML в типовые системы языков программирования или баз данных может быть затруднительным, особенно когда XML используется для обмена высокоструктурированными данными между приложениями, что изначально не было его основной целью. Однако системы привязки данных XML позволяют приложениям получать доступ к данным XML непосредственно из объектов, представляющих структуру данных на используемом языке программирования, обеспечивая типобезопасность, в отличие от использования DOM или SAX для извлечения данных из непосредственного представления XML. Это достигается автоматическим созданием соответствия между элементами XML-схемы XSD документа и членами класса, предназначенного для представления в памяти. Другая критика направлена на опровержение утверждения о том, что XML является самоописываемым языком (хотя сама спецификация XML не содержит подобного утверждения). JSON, YAML и S-выражения часто предлагаются как более простые альтернативы (см. Сравнение форматов сериализации данных), ориентированные на представление высокоструктурированных данных, а не документов, которые могут содержать как структурированный, так и относительно неструктурированный контент. Тем не менее, стандартизированные спецификации XML-схемы W3C предлагают более широкий спектр структурированных типов данных XSD по сравнению с более простыми форматами сериализации и обеспечивают модульность и повторное использование посредством пространств имен XML.