Xml уроки: Учебник XML для начинающих
Содержание
XML Введение — XML: Extensible Markup Language
XML — это язык разметки подобный HTML. Расшифровывается как (англ. Extensible Markup Language — Расширяемый Язык Разметки) и является рекомендацией сообщества W3C в качестве языка разметки общего назначения (W3C recommended). В отличии от остальных языков разметки, XML сам по себе не определён (это означает, что вы должны сами определять используемые теги). Основной целью XML является передача данных между разными системами (даже концептуально разными), такими как интернет.
Много языков базируются на XML; Некоторые примеры: XHTML, MathML, SVG, XUL, XBL, RSS, и RDF. Вы можете создать свой.
Правила оформления
Для корректного XML документа должны исполняться следующие условия:
- Правильное оформление документа.
- Соблюдаться все синтаксические правила XML.
- Документ должен соответствовать семантическим правилам языка (которые обычно заданны в схеме XML или DTD (англ. Document Type Definition (en-US))).
Пример
Пример ниже показывает документ с тегом, который не закрывает сам себя и не имеет закрывающего тега (это неправильно оформленный XML документ).
<message> <warning> Hello World <!--missing </warning> --> </message>
Давайте посмотрим на корректную версию этого документа:
<message> <warning> Hello World </warning> </message>
Документ содержащий неопределённый тег является не корректным. Например, если мы не определили тег <warning>
, документ не корректен.
Примечание: В большинство браузеров встроен дебаггер, который может идентифицировать плохо написанный XML документ.
HTML и XML предлагают методы (которые называют сущности) для обращения к специальным зарезервированным символам (например угловые скобки, обозначающие начало и конец тега). Существует пять сущностей, которые вы обязательно должны знать:
Сущность | Символ | Описание |
---|---|---|
< | < | Знак меньше (одна из угловых скобок) |
> | > | Знак больше (одна из угловых скобок) |
& | & | Амперсанд |
" | « | Двойная кавычка |
' | ‘ | Одинарная кавычка (апостроф) |
Не смотря на то, что по умолчанию создано всего пять сущностей, вы можете добавить в документ свои сущности используя Document Type Definition (en-US). Например, создать новую
&warning;
сущность, можно так:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE body [ <!ENTITY warning "Предупреждение: произошла ошибка, обновите и попробуте ещё раз."> ]> <body> <message> &warning; </message> </body>
Также вы можете использовать нумерические ссылки для специфический специальных символов. Например, © — это символ «©».
XML обычно используют для описания чего-то. Существуют методы отображения XML данных, но если вы не определили способ визуализации XML документа, то в браузере он отобразится построчно, как обычный текстовый файл .
Один из методов отображения XML — указать CSS (чтобы использовать в документе нужно прописать инструкцию xml-stylesheet
, как показано в примере ниже).
<?xml-stylesheet type="text/css" href="stylesheet.css"?>
Есть также много других мощных методов отображения XML, например, XSLT(англ. Extensible Stylesheet Language Transformations), который может использоваться для преобразование XML в другие языки такие, как HTML. Это делает XML очень универсальным.
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
Эта статья является очень маленьким введением в XML, с очень маленьким количеством примеров и ссылок для того, чтобы вы могли начать работать с этим языком. Чтобы больше узнать про XML, вам придётся искать информацию и более информативные статьи в интернете.
Изучайте HTML (англ. HyperText Markup Language), знание HTML поможет вам лучше понять XML.
- XML.com
- Extensible Markup Language (XML) @ W3.org
- XML Example: A List Apart
- Using XML: A List Apart
Статья Using XML — отличный ресурс с большим количеством информации о создании своего языка на основе XML.
Last modified: , by MDN contributors
Хранение данных, XML, HTML— Ruby Rush
Этим уроком мы начинаем блок курса, посвященный тому, как в реальном мире хранятся данные. В следующих уроках мы рассмотрим форматы данных XML, JSON и познакомимся с базами данных.
План урока
- Как по-человечески хранить данные
- Формат данных XML
- Чтение XML в Ruby
- Немного про HTML
Хранение данных для программ
Программы работают с информацией, как человек с пищей — создают, готовят, потребляют, перерабатывают, показывают. Для того, чтобы программам (и программистам) было удобнее с ней работать, информацию нужно как-то хранить, в каком-то удобном виде предоставлять пользователям или другими программам.
Информация бывает очень сложная. Нельзя просто взять и записать в всё в один файл, как попало. Чтобы избежать неразберихи, люди договариваются о стандартах: розетки, батарейки, usb-входы. Программисты — тем более люди, они договорились о форматах и способах хранения данных.
Цель любого формата — структурировать данные, чтобы с ними было проще эффективнее работать: чтобы сразу было понятно, где файл начинается, где хранится служебная информация, как в нём упакованы данные. Форматов и способов хранения данных много, в нашем курсе мы познакомимся с самыми актуальными: XML, JSON и базы данных.
Формат XML
XML — это способ представить любую информацию в виде древовидной структуры. В жизни очень часто человек организует информацию именно в виде дерева. Давайте представим, как могла бы быть в виде XML упакована информация из вашего аккаунта в какой-нибудь социальной сети:
<?xml version="1.0" encoding="utf-8"?> <account> <photos> <photo title="фоточка 1" /> <photo title="фоточка 2" /> </photos> <friends total="2"> <friend number="1">Гоша</friend> <friend number="2">Петя</friend> </friends> </account> <!-- а вот так, кстати пишутся комментарии -->
Типичный XML файл начинается с заголовка, в котором указывается версия XML и кодировка файла <?xml version="1.
. Дальше идёт дерево так называемых тегов. Корень у дерева один. Так и в XML-файле корневой тег-контейнер (оборачивающий всё остальное) — один. В нашем случае 0" encoding="utf-8"?>
<account></account>
.
Теги записываются в треугольных скобках и бывают открывающие (<photos>
) и закрывающие, в начале названия которых стоит слеш (</photos>
). Если какой-то элемент XML-структуры состоит из двух таких тегов, то он называется контейнером, т.к. в нём могут находиться другие элементы:
<photos> <photo title="фоточка 1" /> <photo title="фоточка 2" /> </photos>
Если же у тега нет закрывающего, то такой тег содержит слеш в самом конце: (<photo ... />
).
Ещё у тегов бывают атрибуты, а у атрибутов — значения. Пары атрибут-значение записываются с помощью знака равно: (<photo title="фоточка 2" />
)
Также тег-контейнер может содержать внутри себя кроме других тегов просто обычный текст.
<some_tag> Я текст внутри тега "some_tag" </some_tag>
Вот вкратце и всё, что вам сейчас нужно знать про формат хранения данных XML.
Какие именно теги будут в вашей структуре — уже определяете вы, XML лишь накладывает требования на структуру, которые мы описали выше. Скажем, нельзя открыть тег и не закрыть его, нельзя оставить открой треугольную скобку вот так <error_tag
.
XML настолько популярен, что многие программы в нем хранят данные. Например, популярный редактор текста Microsoft Word: его файлы *.docx
по сути являются zip-архивами, если такой файл переименовать, поменяв расширение на .zip
, то можно залезть внутрь такого архива и посмотреть, какие xml-файлы там лежат.
Проектируем программу для учета расходов
Давайте напишем программу, которая будет показывать, сколько на что мы потратили, а также выводить сумму всех трат за каждый месяц. Для этого нам как-то надо хранить данные о покупках.
Для начала давайте придумаем структуру, в которой мы будем описывать информацию о тратах. Этот XML-файл пока будем редактировать руками, а на следующем уроке научимся делать это с помощью программы.
expenses.xml
:
<?xml version="1.0" encoding="utf-8"?> <expenses> <expense date="9.7.2015" category="Образование" amount="900" > Книжка по Ruby on Rails </expense> <expense date="1.7.2015" category="Хороший программист" amount="400" > Петличка и провода </expense> <expense date="23.6.2015" category="Хороший программист" amount="3500" > Софтбокс + штатив </expense> </expenses>
Вот так мы будем хранить эти данные. Как вы видите, у нас есть корневой тег expenses
, в него вложены теги expense
(по одному на каждую трату), внутри каждого такого тега, текст с информацией о покупке, а в атрибутах date
, amount
и category
соответственно дата, сумма и категория покупки.
Как читать формат XML в ruby
Для того, чтобы удобно работать с XML-файлами во всех современных языках есть парсеры. Парсер — это инструмент (чаще всего библиотека) для чтения данных из текста и представления их в удобной для работы с ними форме. Обычно их в каждом языке даже несколько. Какие-то быстрее, какие-то удобнее. Один из таких парсеров (REXML) уже встроен в Ruby (начиная с версии 1.9). Им и воспользуемся.
Программа для учёта расходов
Сейчас мы напишем программу, которая будет идти по всем тратам и добавлять их в ассоциативный массив, в котором в виде ключа будут даты: то есть все траты, сделанные в один и тот же день, попадут в один и тот же элемент.
Затем мы пройдёмся по всем дням и объединим их в месяцы:
И, наконец, после того, как у нас будут все месяцы с полным набором трат, мы можем вывести пользователю, сколько денег он потратил в каждом месяце и на что.
Давайте писать программу!
expenses_reader.
: rb
require "rexml/document" # подключаем парсер require "date" # будем использовать операции с датами current_path = File.dirname(__FILE__) file_name = current_path + "/my_expenses.xml" # UNLESS в руби - противоположный по смыслу оператору IF # прерываем выполнение программы досрочно, если конечно файл не существует. abort "Извиняемся, хозяин, файлик my_expenses.xml не найден." unless File.exist?(file_name) file = File.new(file_name) # открыли файл doc = REXML::Document.new(file) # создаем новый документ REXML, построенный из открытого XML файла amount_by_day = Hash.new # пустой асс. массив, куда сложим все траты по дням # выбираем из элементов документа все тэги <expense> внутри <expenses> # и в цикле проходимся по ним doc.elements.each("expenses/expense") do |item| # (Обратите внимание это локальная переменная объявленая в теле цикла, для каждой итерации # создается новая такая. За пределами цикла она не видна.) loss_sum = item.attributes["amount"].to_i # сколько потратили loss_date = Date.parse(item.attributes["date"]) # когда. Date.parse(...) создает из строки объект Date # иницилизируем нулем значение хэша, если этой даты еще не было amount_by_day[loss_date] ||= 0 # в руби "a ||= b" эквивалентно "if a == nil a = b" # добавили трату за этот день amount_by_day[loss_date] += loss_sum end file.close # сделаем хэш, в который соберем сумму расходов за каждый месяц sum_by_month = Hash.new # в цикле по всем датам хэша amount_by_day накопим в хэше sum_by_month # значения потраченных сумм каждого дня amount_by_day.keys.sort.each do |key| # key.strftime("%B %Y") вернет одинаковую строку для всех дней одного месяца # поэтому можем использовать ее как уникальный для каждого месяца ключ sum_by_month[key.strftime("%B %Y")] ||= 0 sum_by_month[key.strftime("%B %Y")] += amount_by_day[key] # приплюсовываем к тому что было сумму следующего дня end # пришло время выводить статистику на экран # в цикле пройдемся по всем месяцам и начнем с первого current_month = amount_by_day.
keys.sort[0].strftime("%B %Y") # выводим заголовок для первого месяца puts "------[ #{current_month}, всего потрачено: #{sum_by_month[current_month]} р. ]--------" # цикл по всем дням amount_by_day.keys.sort.each do |key| # если текущий день принадлежит уже другому месяцу... if key.strftime("%B %Y") != current_month # то значит мы перешли на новый месяц и теперь он станет текущим current_month = key.strftime("%B %Y") # выводим заголовок для нового текущего месяца puts "------[ #{current_month}, всего потрачено: #{sum_by_month[current_month]} р. ]--------" end # выводим расходы за конкретный день puts "\t#{key.day}: #{amount_by_day[key]} р." end
Немного об HTML
HTML — грубо говоря, одна из разновидностей XML. Требования к разметке в некоторых версиях HTML, однако (а версий HTML много, сейчас, например, самая актуальная HTML5), могут существенно отличаться о того, что мы рассказали про XML.
Когда браузер заходит на какой-то сайт, он отправляет запрос и в качестве ответа получает в том числе текст в формате html. Браузер его обрабатывает и превращает в текст (также как Word превращает xml в те файлы, с которыми мы привыкли работать).
Давайте зайдём на сайт rubyrush.ru и посмотрим его html-разметку. Для этого нажмите на любой неактивный элемент на сайте правой кнопкой мыши и выберите пункт «Исходный код страницы», или просто нажмите Ctrl+U
.
Те блоки гипертекста, которые вы видите, вам должны показаться знакомыми — тоже тэги, вложенные друг в друга, атрибуты и так далее. Нам это знание пригодится в последующих уроках, когда будем работать с сетью.
Итак, мы узнали о формате XML, научились читать данные из XML-файлов и узнали немного про HTML. На следующем уроке мы научимся писать свои XML файлы и сделаем так, чтобы нам не приходилось добавлять траты в файл expenses.xml
руками.
Как можно использовать XML?
❮ Предыдущий
Далее ❯
XML используется во многих аспектах веб-разработки.
XML часто используется для отделения данных от представления.
XML отделяет данные от представления
XML не содержит никакой информации о том, как должно быть отображено.
Одни и те же XML-данные могут использоваться во многих различных сценариях представления.
Из-за этого в XML существует полное разделение между данными и
презентация.
XML часто является дополнением к HTML
Во многих HTML-приложениях XML используется для
хранить или транспортировать данные, в то время как HTML используется для форматирования и отображения
одни и те же данные.
XML отделяет данные от HTML
При отображении данных в формате HTML вам не нужно редактировать файл HTML при изменении данных.
При использовании XML данные могут храниться в отдельных файлах XML.
С помощью нескольких строк кода JavaScript вы можете прочитать файл XML и обновить
содержимое данных любой HTML-страницы.
Книги.xml
<книжный магазин>
<книга
category="cooking">
Итальянский
Поттер
Быстрый старт
Нагараджан
Вы узнаете намного больше об использовании XML и JavaScript в разделе DOM этого руководства.
Данные транзакций
В различных отраслях промышленности существуют тысячи форматов XML для описания повседневных транзакций данных:
- Акции и акции
- Финансовые операции
- Медицинские данные
- Математические данные
- Научные измерения
- Новостная информация
- Погодные услуги
Пример: XML News
XMLNews — это спецификация для обмена новостями и другой информацией.
Использование стандарта облегчает как производителям новостей, так и потребителям новостей создание, получение и архивирование любой новостной информации для различных аппаратных средств, программного обеспечения и языков программирования.
Пример документа XMLNews:
» ?>
<голова>
<тело>
<заголовок>
<дата>