Основи XML для початківців. "3.XML буде сумісний з SGML."

Цей розділприсвячений роботі з XML. У ньому буде зібрано як теоретичний, так і практичний матеріал. Будуть розглянуті основні операції з XML файлами, а також взаємодія з LINQ та багато іншого.

Створення файлу XML

XML(Extensible Markup Language) — мова розмітки, що розширюється, застосовується для створення баз даних, web сторінок, використовується для обміну інформацією між програмами, застосовується в таких технологіях, як Ajax, SOAP, а також є основою мови XAML, з якою Ви можете зустрітися під час роботи з WPF.

Для створення xml файлу нам лише необхідно внести

Структура файлу XML

Будь-який XML файл починається з оголошення декларації.

Декларація

Декларація xmlфайлу включає:

Версія (version) — номер версії мови XML, 1.0 та 1.1

Якщо Ви використовуєте , то рядок декларації можна не вказувати, якщо Ви використовуєте версію 1.1, необхідно обов'язково вказати цей рядок.

Кодування (encoding) — вказує кодування файлу

Цим записом Ви не встановлюєте кодування фізичного файлу! А тільки даєте зрозуміти програмі, яка оброблятиме даний файл, в якому кодуванні містяться дані всередині файлу. При цьому Ви повинні гарантувати, що кодування документа та кодування, зазначене у рядку декларації, збігаються.

Щоб встановити кодування документа, можна скористатися, наприклад, програмою Notepad++

Елементи xml файлу

Мова XML складається з елементів.

Елемент — це рядок, який містить теги, що відкриває і закриває, а також дані, поміщені між ними.

  • значення- Елемент

В одному файлі може міститися будь-яка кількість елементів.

Теги

Як згадувалося раніше, елемент складається із тегів.

  • - Тег

Імена тегів можуть починатися з літери, символу підкреслення, або двокрапка знака, потім можуть вказуватися будь-які символи.

Теги бувають: парні та одиночні.

  • - парний
  • - одиночний

Одиночний тег може застосовуватися в ситуації, коли між тегами не міститься будь-яка інформація, при цьому, щоб не вказувати, парний тег і порожнечу між ними, використовуйте одиночний тег, який у будь-який момент можна буде замінити на парний. Одиночний тег обов'язково має бути закритим!

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

  • Не правильно
  • Правильно

XML регістро-залежна мова

  • помилка!
  • правильно
  • правильно

Коментарі

Коментарі в XML документі використовують такий же синтаксис, як у мові HTML.

Після оголошення декларації та знайомства з основними складовими мови XML переходимо до наповнення нашого файлу.

Кореневий елемент

Першим завжди вказується кореневий елемент (root element), в одному документі XML може бути тільки один кореневий елемент!

У даному прикладі, створено два кореневі елементи

  • не правильно
  • правильно

У другому прикладі створено один кореневий елемент Root, який містить звичайний елемент Admin.

Після оголошення кореневого елемента, Ви можете додавати будь-яку кількість елементів до вашого . Всі елементи, що додаються, обов'язково повинні знаходитися між тегами кореневого елемента.

"library" кореневий елемент містить елемент book, який містить вкладені елементи: title, author, year.

Атрибути xml файлу

Атрибути встановлюють у тезі, що відкриває, будь-якого елемента.

Синтаксис: ім'я = значення, укладене в подвійні лапки.

Атрибутів може бути будь-яка кількість, але вони не повинні повторюватися, а їхні імена не повинні містити пробілів.

  • не правильно
  • не правильно

Помилка, присутні два атрибути «id», що повторюються, а так само між id і number міститься пробіл.

  • правильно
  • правильно

Після того, як XML документстворено, його необхідно зберегти, при цьому не забувайте змінити розширення файлу.

  • ім'я_файлу.xml
1. Вступ

Якщо хтось із вас коли-небудь намагався вивчити XML своїми силами, Ви можливо зустрічалися з багатьма поняттями, що збивають з пантелику, що обрушилися і на мене свого часу. DTD, XML Schema, простір імен (namespaces), XPath, XPointers, XSL, XSLT, DOM, SAX, SOAP, Все, я здаюся. Додам лише, що більшість із цих матеріалів базується на реалізаціях, код яких може містити помилки. Напевно існують мільйони способів реалізації та використання XML, але вони можуть бути досить складні. А знаєте, XML може бути дуже простим. Якщо ми забудемо про DTD, XML Schemas, простору імен (namespaces) тощо.
Намагаючись швидше навчити вас роботі з XML, я по можливості ігноруватиму пристойну частку інформації, яку ви і так зможете прочитати у відповідній літературі. І перше що я збираюся проігнорувати, це простір імен (namespaces) та схеми (schemas). Вам це може здатися дивним, оскільки більшість книг починаються саме з пояснення цих понять, але постарайтеся думати про XML як засіб вирішити конкретне завдання, як, наприклад, про молотку. Щоб користуватися молотком, хіба обов'язково знати, як побудувати будинок? Що якщо все, що мені потрібно, це просто вбити цвях, щоб повісити на нього картину? Те ж саме і з XML, він може бути дуже складним, досить універсальним для використання в сотнях, якщо не в тисячах додатків, і дуже простим, якщо не звертати уваги на деякі речі. У цій статті, я концентруватимуся на вирішенні конкретних проблем за допомогою XML.
То в чому ж власне проблема? Давайте припустимо, що хочу описати простий об'єкт, наприклад склянку, використовуючи XML. Навіщо я збираюся використовувати XML для цього? Ну, по-перше, це саме те, навіщо і призначений XML. XML описує дані. У моєму прикладі, склянка, це і є дані. У житті даними можуть бути документи Word, листи електронних таблиць, зображення, книга, запис бази даних, або навіть класи C++ або Visual Basic. По-друге, XML розширюємо. XML дозволяє мені створювати стільки ознак, скільки необхідно для опису даних, і ці ознаки будуть такими, якими я захочу. І, нарешті, тому що XML швидко стає стандартом. Якщо на Марсі є життя, то можете не сумніватися, що вони зможуть зрозуміти мій XML файл.

Які основні властивості дають змогу описати склянку?

Як би те саме виглядало у форматі XML?

glass 6 16 ice cube straw water yes

Зауважте, що перший рядок файлу () має спеціальний вигляд, поки, просто запам'ятайте, що вона має бути тут. Принадність формату XML у тому, що будь-хто може зрозуміти, про що в ньому йдеться, просто уважніше глянувши на нього. Зрозуміло також, що це не єдиний із можливих XML описів склянки. Якщо я попрошу 10 людей розробити XML опис склянки з однаковими властивостями, можливо всі вони створять різні, але вірні описи. Ось тут якраз і криється проблема. Можливо не для нас, людей, але коли комп'ютер читає XML файл, то було б чудовою ідеєю дати йому знати, про що цей файл. Ось тут і спливає простір імен (namespaces) та схеми (schemes). Простіше кажучи, схеми використовуються визначення адекватної структури для XML файла.
Тепер настав час поговорити про кілька простих правил XML, яким необхідно дотримуватись:

Правило XML #1: Адекватний XML файл повинен точно відповідати своїй схемі. Але для простоти розуміння матеріалу, жоден з моїх прикладів не використовуватиме схеми. Таким чином, строго кажучи, жоден із моїх прикладів не є "адекватним". Але, чесно кажучи, мені байдуже. Я не збираюся будувати будинок, мені потрібно лише повісити картину. Я докладніше розповім про це пізніше, коли обговорюватимемо об'єктну модель документів XML.

Правило XML #2: Якщо ви програмуєте на VB, запам'ятайте: XML чутливий до регістру XML чутливий до регістру. XML чутливий до регістру. XML чутливий до регістру. Напишіть цю пропозицію 1000 разів і ніколи не забудете.

Правило XML #3: Теги прийнято називати елементами і кожен тег, що відкривається, повинен мати відповідний йому закривається тег. Дотримуючись цього правила, у вас вийде правильний файл XML. Це дуже важливо, тому що доки XML файл не буде правильно оформлений, він не буде проаналізований і не завантажиться в об'єктну модель документів. Зауважте, якщо елемент не містить значень і не містить інших (вкладених) елементів, тег, що закриває, може мати вигляд замість більш громіздкої конструкції . Можете побачити такий підхід у попередньому прикладі ( ).

Правило XML #4: Елементи можуть містити атрибути, а значення атрибутів повинні бути поміщені в лапки (одинарні або подвійні).

Правило XML #5: Можна використовувати імена атрибутів кілька разів, але імена елементів повинні бути унікальними для всього файлу. У попередньому прикладі атрибут qty мав різне значення в залежності від того, в якому елементі він використовується ,, або . Значення атрибуту залежить від його використання. Тоді як значення елемента завжди означає те саме, незалежно від цього, де файлу атрибут перебуває. У попередньому прикладі, елемент і завжди має одне й те саме значення у всьому нашому документі. наприклад, завжди використовується для опису висоти склянки.

Правило XML #6: У XML є кілька спеціальних символів, які не можуть бути використані безпосередньо, тому що зарезервовані в синтаксисі XML. Тому для використання таких символів доведеться використовувати зарезервовану конструкцію, що починається з символу & і спеціального коду, (символ & повинен писатися як &) (символ " повинен писатися як ") (символ< должен писаться как <) (символ >повинен писатись як >) і (символ " повинен писатися як "). Натомість, також можна використовувати інструкціюде на місці "...." може бути будь-яка послідовність символів, крім "]]>". Така конструкція може зустрічатися будь-де, але вона може бути вкладеної.

2. Об'єктна модель документів XML

Об'єктна модель документів XML дозволяє програмістам завантажувати вміст файлу XML у пам'ять. Як тільки XML файл завантажено таким чином, з ним можна працювати, використовуючи властивості, методи та події об'єктної моделі документів. Ось де і проявляється користь XML. Об'єктна модель документів значно полегшує вибірку та обробку інформації XML-файлу. Я не розповідатиму про всі можливості об'єктної моделі документів, розповім лише про деякі основні можливості, які допоможуть у досягненні мети цієї статті. Я візьму щойно створений XML файл з описом склянки, завантажу його в об'єктну модель документів і зроблю кілька дій з нею. Інші особливості та можливості об'єктної моделі документів я прибережу для наступної статті, яка розповідає про клієнтський XML. Зауважте, незважаючи на те, що об'єктна модель документів дуже хороша і зручна для розробників, вона вимагає досить значного обсягу системних ресурсів. Тому існує ще один метод аналізу файлів XML, відомий як SAX. Моя стаття не претендує на вичерпне джерело інформації з цього питання, тому було б корисно також скористатися XML SDK.

Давайте подивимося на приклад, використовуючи аналізатор Microsoft XML версії 3.0 (Microsoft XML parser version 3.0 (msxml3.dll)) щоб розібратися, як же це все працює. Якщо у вас немає аналізатора, останню версію можна завантажити з сайту Microsoft.
Припустимо, я зберіг приклад опису склянки у форматі XML у файл "http://web_server/xml/cup.xml" (локальний шлях C:\inetpub\wwwroot\xml\cup.xml) і тепер хочу завантажити його в об'єктну модель документів . Наступний код передбачає, що аналізатор вже завантажено та працює.

Код Visual Basic 6.0:(встановлюємо зв'язок з Microsoft XML, v3.0) Dim xmlDoc as MSXML2.DOMDocument30 Set xmlDoc = New DOMDocument30 xmlDoc.async = False xmlDoc.validateOnParse = False xmlDoc.load ("c:\inetpub\wwwroot\xml\cup" ) msgBox xmlDoc.xml ASP Server-Side код на Visual Basic: Dim xmlDoc Set xmlDoc = Server.CreateObject("Msxml2.DOMDocument.3.0") xmlDoc.async = False xmlDoc.validateOnParse = False xmlDoc.load "/xml/cup.xml" ASP Server-Side код Java Script: var xmlDoc = Server.CreateObject("Msxml2.DOMDocument.3.0"); xmlDoc.async = false; xmlDoc.validateOnParse = false; xmlDoc.load ("/xml/cup.xml");

Пояснення наведеного коду - пройдемося кодом на VB6

Рядок 1: Dim xmlDoc as MSXML2.DOMDocument30

У цьому першому рядку визначаємо посилання "Microsoft XML, v3.0". У цьому рядку я визначив змінну xmlDoc як посилання на документ XML. MSXML2 це бібліотека (використовуйте цю назву, не намагайтеся написати MSXML3, це не працюватиме). DOMDocument30 визначає об'єкт XML документа, що відповідає версії 3.0. Також ви можете зустріти такий код: dim xmlDoc as MSXML2.DOMDocument. Такий конструкцією зазвичай користуються, коли хочуть вказувати конкретну версію XML документа. У цьому випадку використовуватиметься зареєстрований за умовчанням у системі аналізатор. Проблема може бути лише в тому, що версія аналізатора, зареєстрована за замовчуванням, може бути різною на різних комп'ютерах. Якщо ви хочете бути впевненими в тому, що написаний вами код буде працювати з будь-якою версією аналізатора, то не використовуйте специфічних для конкретних версій аналізатора конструкцій. Тому що немає жодної гарантії, що у користувача, який користуватиметься вашим кодом, встановлено імена та версія аналізатора, під яку ви писали свій код. Ще одна перевага розробки коду, незалежного від версії аналізатора в тому, що коли виходить нова версія аналізатора, у неї обов'язково буде зворотна сумісність з попередніми версіями, і вам не доведеться перекомпілювати ваш код.

Рядок 2: Set xmlDoc = new DOMDocument30

У цьому рядку відбувається ініціалізація змінної xmlDoc як нового екземпляра XML об'єкта документа версії 3.0.

Рядок 3: xmlDoc.async = False

Файли XML можуть бути завантажені або в синхронному режимі або в асинхронному режимі. Якщо xmlDoc.async = False, то означає, що вміст XML фала буде завантажено, і тільки після цього керування буде передане процесу, що викликає. Якщо xmlDoc.async = True, то це означає, що керування буде передано виклику процесу відразу, не чекаючи, поки вміст XML файлу буде повністю завантажено.

Рядок 4: xmlDoc.validateOnParse = False

Цей код повідомляє про те, що аналізатор не повинен перевіряти завантажуваний XML файл на відповідність своїй схемі (validateOnParse = False). Щоб увімкнути перевірку на відповідність схеми, потрібно написати validateOnParse = True.

Рядок 5: xmlDoc.load ("C:\inetpub\wwwroot\xml\cup.xml")

У цьому рядку викликається метод завантаження вказаного файлу XML. Існує два види методу завантаження. Перший, який написаний у рядку 5, завантажує файл в об'єктну модель документів, і при цьому обов'язково потрібно передавати повний шлях до XML файлу. Другий варіант завантаження передбачає передачу як параметр xml рядок. Такий вид завантаження міг би бути викликаний, наприклад, так: xmlDoc.loadXML("коректний рядок xml"). Я покажу, як користуватися цим способом пізніше.

Рядок 6: MsgBox xmlDoc.xml

Цей рядок відображає вміст завантаженого файлу XML. В результаті ми повинні отримати вихідний XML файл, який створили раніше.

2.2. Дослідження об'єктної моделі документів XML

Створіть новий проект у Visual Basic і назвіть його standard.exe. Вставте наведений вище код метод завантаження головного вікна вашого проекту. Переконайтеся, що ви оголосили посилання саме на Microsoft XML v3.0. Для того, щоб це зробити, натисніть Project-->References, потім пролистайте список вниз і знайдіть у ньому потрібне посилання. Зауважте, що аналізатор версії 3.0 повинен бути встановлений на вашому комп'ютері, інакше в списку його не буде. Встановіть точки зупинки на останньому рядку коду (msgbox xmlDoc.xml). Запустіть програму в режимі налагодження. Коли процес виконання дійде до зупинки, викличте вікно "Locals" і перегляньте об'єктну модель документів. Можна багато дізнатися, переглядаючи те, що відображено у цьому вікні. Вікно "Locals" має бути схожим на те, що зображено на малюнку нижче. Ось деякі цікаві властивості об'єктної моделі документів.

Об'єктна модель документів XML завжди містить два вузли верхнього рівня:

  • Item1 це корінь гілки елементів документа (не звертайте на неї уваги)
  • Item2 насправді перший елемент документа (запам'ятайте це)

nodeName або baseName - можуть бути використані для пошуку імені елемента або атрибута.
nodeType - використовуйте для отримання типу поточного вузла.
nodeValue - використовуєте у тому, щоб дізнатися значення даних вузла.
childNodes - це колекція вузлів-нащадків. Вони можуть бути вузлами елементів, текстовими вузлами та вузлами CDATA. Можуть бути інші типи вузлів, про які я зараз розповідати не стану, але ви зможете дізнатися все про них в XML SDK.
attributes – це колекція вузлів атрибутів поточного елемента.
length - використовується визначення кількості вузлів у дереві безпосередньо належать поточному.
xml - ця властивість присутня у всіх вузлах і може бути використана для представлення поточної позиції у документі. XML-рядок починається з поточного вузла і проходить вниз до кінця дерева. Це дуже корисна властивість. Поекспериментуєте з ним та побачите, що вийде.

2.2.2. Вузли елементів

Вузол елементів може містити вузли нащадків елементів, атрибутів, тексту або CDATA. З малюнка нижче видно наступну інформацію про сайт "SOLID":

nodeType – Тип поточного вузла = NODE_ELEMENT – тобто. поточний вузол є елементом.
nodeName або baseName або tagName – Назва поточного вузла (елемента) = SOLID.
Його батьківський елемент CONTENTS має 4 нащадків.
Це можна побачити на наступному малюнку, але SOLID має нащадка, який має текстовий тип даних.
text - "ice cube" - це скорочений метод, що дозволяє отримати значення поточного вузла без переміщення до текстового вузла нащадка.

2.2.3. Вузли атрибутів

Вузли атрибутів можуть складатися тільки з текстових або CDATA вузлів-нащадків. На наступному малюнку показано, яка інформація може бути отримана про сайт "qty":

nodeType – Тип поточного вузла = NODE_ATTRIBUTE – поточний вузол є атрибутом.
nodeName або baseName - Ім'я поточного вузла (атрибутів) = qty

З наступного малюнка також зрозуміло, що qty має нащадка, який має текстовий тип даних.
text чи value - "2" це скорочений метод, що дозволяє отримати значення поточного вузла без переміщення до текстового вузла нащадка.

2.2.4. Текстові вузли та вузли CDATA

Текстові або CDATA вузли не містять нащадків. Текстові вузли містять оброблені текстові дані батьківського вузла. CDATA містять необроблені текстові дані батьківського вузла. CDATA вузли створюються, коли дані у XML файлі спеціальним чином обрамлені. Мітка CDATA говорить аналізатору не розбирати дані та приймати символи всередині цієї мітки як дані. Секція CDATA особливо корисна, коли потрібно вставити код у XML-файл. На наступному малюнку показано, яку інформацію можна отримати з поточного текстового вузла:

nodeType – Тип поточного вузла = NODE_TEXT – поточний вузол містить текстові дані.
nodeName - Ім'я поточного вузла (текстового) = #text - всі текстові вузли називаються #text
data чи text чи value - "2" - це поточні дані вузла.

2.2.5. Помилки під час завантаження документа

Секція parseError об'єктної моделі документів може бути корисною при виявленні проблем, що виникають при завантаженні документа XML. Якщо я видалю тег, що закриває, від OTHER у файлі нашого прикладу і спробую запустити програму ще раз, то отримаю наступний результат. Перша частина корисної інформації, це те, що наш nextSibling тепер містить значення Nothing. Тепер, якщо ви подивитеся на childNodes, ви можете побачити, що поле length тепер дорівнює 0. Обидві ці ознаки говорять про те, що наш XML документ не був завантажений. Щоб розібратися чому, я відкриваю вузол parseError та отримую всю інформацію про помилки.

Отже, я показав вам, як завантажити XML-файл в об'єктну модель документів, але що з ним там робити? Одна з основних можливостей, якою ви зможете користуватися, це виконувати різні запити до XML документа. Для цього ви звичайно можете переглядати весь документ доти, доки не знайдете інформацію, яку шукайте. Але найбільш кращим способом є використання одного з двох методів класу DOMDocument. Два методи, що використовуються для пошуку вузлів у нашому попередньому прикладі, могли б виглядати як xmlDoc.SelectSingleNode(patternString) - для отримання шуканого вузла, або xmlDoc.SelectNodes(patternString) - для отримання списку вузлів, що шукаються. Параметр patternString таки є запитом. Він може бути сформований одним із двох способів. Або як XSL запит, чи як XPath запит. Новіший і кращий спосіб створювати запити до XML документа, це XPath. Формат patternString повинен бути встановлений заздалегідь перед першим викликом будь-якого з двох методів запиту даних, інакше за замовчуванням буде використовуватися XSL спосіб формування запитів. Для встановлення типу формування patternString використовуйте setProperty("SelectionLanguage", "format"). Щоб змінити запити в нашому прикладі таким чином, щоб використовувався спосіб XPath, я додам наступну команду: setProperty("SelectionLanguage","XPath"). По-моєму, XPath це найважливіша технологія в XML, яку слід вивчити. Я наведу кілька простих XPath запитів. Хорошим початком вивчення цієї технології може бути Microsoft XML SDK. Ще одним способом для пояснення цього, могло б бути написання простої програми на Visual Basic, яка дозволяє вводити запити та виводити результат. Ви, можливо, знайдете якісь безкоштовні програми, які роблять те ж саме, але XPath досить новий і може не повністю підтримуватися цими програмами.

2.3.1. Використання XPATH для виконання запитів до об'єктної моделі документів

Давайте додамо деякий код у кінець нашого попереднього прикладу для того, щоб повернути вміст нашої склянки:

ВІДМІННО! Давайте тепер додамо ще один запит, який дозволить нам визначити, чи є у склянки кришка чи ні. Додайте наступний код до кінця попереднього:

Set objNode = xmlDoc.selectSingleNode("/CUP/LID") if objNode.text="yes" then MsgBox "Ви маєте люд" else MsgBox "No lid on this cup" end if

Пройдемося за кодом рядок за рядком:

Рядок 1: Dim objNode As IXMLDOMNode

У цьому рядку визначається змінна objNode типу вузол документа XML. Важливо розуміти, що вузол документа XML теж об'єкт. Не значення. Він складається сам із себе, як і його атрибути і нащадку (childNodes). Цим способом можна відсікати непотрібні гілки дерева, вибираючи тільки потрібні.

Рядок 2: Dim objListOfNodes As IXMLDOMNodeList

У цьому рядку визначається змінна objListOfNodes, яка має тип списку вузлів XML документа (групи вузлів).

Рядок 3: xmlDoc.setProperty "SelectionLanguage", "XPath"

Цей рядок встановлює спосіб формування patternString як XPath.

Рядок 4: МсгBox

Рядок 5: Set objListOfNodes = xmlDoc.selectNodes("//CONTENTS/*[@qty>0]")

Цей рядок виконує XPath запит, який поверне групу вузлів і збереже їх у змінній objListOfNodes. Запит розбитий на такі частини:

  • //CONTENTS - взяти всі елементи CONTENTS у документі XML. Зауважте: // - це коротке позначення всього вмісту XML документа.
  • /* - зі списку елементів CONTENTS взяти все (* - використовується для вказівки всіх) елементи-нащадки. Це скорочує отриманий результат до чотирьох вузлів елементів ( ). Ці чотири вузли потрапляють безпосередньо під вузол CONTENTS.
  • [@qty>0] - перевірити кожен елемент-нащадок на те, щоб його атрибут qty (@ - означає атрибут) був більшим за 0. Якщо ця умова не виконується, вузол відкидається. Все, що всередині запиту XPath може приймати значення True або False. Якщо результат true, то вузол зберігається. Якщо результат False, то вузол відкидається. Після цього результат скорочується до трьох вузлів (

Рядок 6-8: For Each objNode In objListOfNodes / MsgBox objNode.Text / Next

Ці рядки відображають значення кожного вузла елемента, які відповідають запиту. ("ice cube", "straw", "water").

Рядок 9: Set objNode = xmlDoc.selectSingleNode("/CUP/LID")

Цей рядок повертає всі елементи LID, які належать елементу CUP, який, у свою чергу, породжений коренем дерева (коли запит починається з /, то це означає, що починати потрібно з кореня). Це дуже схоже на шлях до файлу чи папки. У нашому прикладі цей запит поверне елемент LID, який містить значення "yes". Важливо тут те, що я вказав на запит починати з кореневого елемента XML документа. Запити не завжди починаються з кореневих елементів, зазвичай вони починаються з поточного вузла. У нашому прикладі це не має значення, оскільки поточним вузлом (xmlDoc) є кореневий елемент XML документа (але не у всіх випадках це так).

Рядок 10-15: if objNode.text="yes" then / MsgBox "We have a lid" /
else / MsgBox "No lid on this cup" /end if

Цей рядок відображає повідомлення "We have a lid" тому, що текстова властивість елемента LID "yes".

3. Перетворення ADO на XML

Тепер, коли ви зрозуміли основи XML, давайте створимо елемент керування ActiveX, який конвертуватиме набір даних ADO в XML формат. Мета полягає в тому, щоб отримати найменування книг з таблиці Titles бази даних Pubs і повернути їх у форматі XML. Результат, який вийде я використовуватиму у своїй наступній статті. Ви можете сказати, ADO має власні методи для збереження результату у форматі XML, правильно? Так, але якщо довірити це ADO, то в результаті я отримаю XML файл у такому жахливому форматі, що з ним неможливо буде працювати. ADO створить XML файл із використанням простору імен, а мені зараз це зовсім не потрібно. По-друге, ADO створить XML-файл, який буде представлений у формі атрибутів. Іншими словами, кожен запис стане елементом і кожне поле – атрибутом:

А мені хотілося б отримати XML файл у формі елементів, де кожен запис, містився б у тезі , і кожне поле було б елементом усередині тегу . Синтаксис мого рядка XML був би таким:

data from table data from table data from table data from table data from table datafrom table datafromtable

До речі, те, що я тільки-но зробив, це створив схему для мого XML рядка. Тепер, якщо мені потрібно звірити структуру XML документа зі схемою, все, що мені залишиться зробити, це перетворити схему на правильний формат. Тобто синтаксис DTD або XDR. Зауважте, що я додав деякі атрибути до кожного елемента . Однією з причин цього є те, що ця інформація може бути використана клієнтом. Prettyname можуть бути використані як мітки даних. Атрибут datatype може бути використаний для перевірки даних на стороні клієнта. Але щоб бути чесним, істина причина того, що з'явилися ці атрибути в тому, що вони мають особливе призначення в шаблоні XSL фала, який я часто використовую для побудови секції, де SQL запитів. Можливо, я незабаром опублікую статтю, яка демонструє цей підхід. Шаблон насправді дуже корисний. Коли XML структура застосовується до даних з таблиці Titles, результат буде виглядати так:

The Busy Executive"s Database Guide BU1032 The Busy Executive"s Database Guide business 19.99 4095 Назавжди існуючі бази даних систем з юрисдикцією на спільних business applications. Illustrated. 6/12/1991 Cooking with Computers: Surreptitious Balance Sheets BU1111 Cooking with Computers: Surreptitious Balance Sheets business 11.95 3876 Досвідчені шлунки на те, як використовувати свої електронні ресурси до кращого розпізнавання. 6/9/1991

Тепер я одержав щось, з чим можна працювати!

Лістинг 1 - CUP.XML

glass 6 16 ice cube straw water yes

Dim xmlDoc As MSXML2.DOMDocument30 Set xmlDoc = New DOMDocument30 xmlDoc.async = False xmlDoc.validateOnParse = False xmlDoc.Load ("c:\inetpub\wwwroot\xml\cup.xml") MsgBox xmdoj Як IXMLDOMNodeList xmlDoc.setProperty "SelectionLanguage", "XPath" MsgBox "Вибраний номер містить наступні елементи" Set objListOfNodes = xmlDoc.selectNodes("//CONTENTS/*[@qty>0]") For Each objNode In objListOf Text Next Set objNode = xmlDoc.selectSingleNode("/CUP/LID") If objNode.Text = "yes" Then MsgBox "Ви маєте людей"

Лістинг 3 - Елемент керування ActiveX: ADO в XML (WebClass.dll) (xmlControl.cls)

Option Explicit "Declare Database variables Private m_dbConnection As New ADODB.Connection Private m_dbCommand As ADODB.Command Private m_adoRs As ADODB.Recordset Private m_adoErrors As ADODB.Errors Private m_adoErr As Error Connect As Variant Public strAppName As As String Public strLogPath As String Public strDatabase As String Public strUser As String Public strPassword As String Public strServer As String Public strVersion As String Public lMSADO As Boolean " vate gstrDB As String Private gstrADOError As String Private Const adLeonNoRecordset As Integer = 129 Private gtableName(6) As String Private gcolumnName(6) As String Private gprettyName(6) As String Private gdatatype(6) As String Private gfilter(6) As String Private Function OpenData If Len(strConnect) = 0 Then "встановлюємо значення за замовчуванням If Len(strDatabase) = 0 Then strDatabase = "pubs" End If If nConnectionTimeOut = 0 Then nConnectionTimeOut = 600 End If If nCommandTimeOut = 0 (strAppName) = 0 Then strAppName = "xmlControl" End If If Len(strUser) = 0 Then strUser = "sa" End If If Len(strPassword) = 0 Then strPassword = "" End If strConnect = "Provider=SQLOLEDB.1 ; " & _ "Application Name=" & strAppName & _ "; Data Source=" & strServer & "; Initial Catalog=" & strDatabase & "; " & _ " User ID=" & strUser & "; Password=" & strPassword & ";" End If "підключаємося до SQL Server і відкриваємо базу даних On Error GoTo SQLErr "Включаємо обробник помилок With m_dbConnection .ConnectionTimeout = nConnectionTimeOut .CommandTimeout = nCommandTimeOut .Open strConnect "відкриває With On Error GoTo 0 "вимикаємо обробник помилок OpenDatabase = True "база даних відкрита успішно Exit Function SQLErr: Call logerror("OPEN") OpenDatabase = False End Function (Optional xmlWhere As Variant) As String Dim whereClause As String Dim strSQL As String Call OpenDatabase "відкриваємо базу даних pubs If IsMissing(xmlWhere) Then "коли запит не пройшов whereClause = "" Else whereClause = BuildSQLwhere( sql End If "ініціалізуємо sql вираз, який буде запитувати заголовки книг strSQL = "select title_id,title,type,price,ytd_sales,notes,pubdate from titles" & whereClause Call NewRecordSet "створюємо набір даних" встановлюємо cursorlocation m_adoRs. CursorLocation=adUseClient" відкриваємо набір записів m_adoRs.Open strSQL, m_dbConnection, adOpenForwardOnly, adLockReadOnly, adCmdText "відключаємося від набору даних Set m_adoRs.ActiveConnection = Database If m_adoRs. EOF Then GetTitlesXML = "" "запит не повернув жодного значення Else If lMSADO Then GetTitlesXML = msado(m_adoRs) "конвертуємо набір даних у Microsoftado->xml Else GetTitlesXML = ADOtoXML(m_adoRs, True) End If End If "закриваємо набір даних Call CloseRecordset Exit Function SQLErr: Call logerror(strSQL) End Function Private Function ADOtoXML(tmprs As ADODB. adoField As ADODB.Field "використовується для отримання кожного поля з колекції Dim xmlDoc As msxml2.DOMDocument30 Dim tmpLine As String "зберігає xml представлення кожної книги Dim tmpXML As String "служить для конкатенації xml рядків Dim i As Integer If tmpr не повернув жодного запису ADOtoXML = "" Exit Function Else Set adoFields = tmprs.Fields "створюємо колекцію полів End If tmpXML = " Всі книги будуть укладені в тег Do Until tmprs.EOF "цикл по кожному рядку в наборі даних i = 0 " I - індекс ado поля, який починається з 0 - перше поле буде field(0) tmpLine = " " & tmprs("title") & vbCrLf For Each adoField In adoFields "цикл по всіх полях "будуємо xml тег та його атрибути для поточного поля tmpLine = tmpLine & " " & adoField.Value tmpLine = tmpLine & "" & vbCrLf i = i + 1 "переходимо на наступне поле Next tmpXML = tmpXML & tmpLine & "&vbCrLf "закриваючий тег після останнього поля tmprs.MoveNext "наступний заголовок Loop Set adoField = Nothing "знищуємо об'єкт-поле Set adoFields = Nothing "знищуємо об'єкт-колекцію полів tmpXML= tmpXML & "& vbCrLf "закриваючий тег Set xmlDoc = New msxml2.DOMDocument30 "створення xmlDOM xmlDoc.async = False "чекаємо коли документ завантажиться xmlDoc.validateOnParse = False "не звіряємося зі схемою xmlDoc.loadXML(tmpXML) "завантажуємо рядок в об'єктну модель документів On Error Resu не існує, то обробляємо цю помилку Kill("c:\temp\custom.xml") "стираємо файл якщо він існує On Error GoTo 0 "говоримо обробнику помилок перериватись при виявленні помилки xmlDoc.save ("c:\temp\custom. xml") "зберігаємо xml у файл ADOtoXML=xmlDoc.xml "повертає xml рядок Set xmlDoc=Nothing "знищуємо об'єктну модель документів msado(tmprs As ADODB.Recordset) "якщо файлу не існує, отримуємо помилку Kill ("c:\temp\msado.xml") "стираємо файл, якщо він існує On Error GoTo 0 " говоримо обробнику помилок перериватися при виявленні помилки tmprs.save "c:\temp\msado .xml", adPersistXML " зберігаємо xml у файл Set xmlDoc = New msxml2.DOMDocument30 "створюємо об'єктну модель документів xml xmlDoc.async = False "чекаємо на завантаження xml документа xmlDoc.validateOnParse = False "не звіряємося зі схемою xmlDoc. \temp\msado.xml") "завантажуємо файл в об'єктну модель документів msado = xmlDoc.xml "повертаємо xml рядок Set xmlDoc = Nothing "знищуємо об'єктну модель документів End Function Private SubCloseRecordset() "закриваємо набір даних m_adoRs.Close Set m_ado End Sub Private Sub NewRecordSet() Set m_adoRs= Nothing Set m_adoRs=New ADODB.Recordset End Sub Private Sub CloseDatabase() m_dbConnection.Close Set m_dbConnection =Nothing End Sub Private Sub logerror(errSQL As String) Dim On Error GoTo 0 gnErrNum = Err.Number gstrErrDesc =Err.Description gstrErrSrc = Err.Source Set m_adoErrors = m_dbConnection.Errors For Each m_adoErr In m_adoErrors gstrADOError = m_adoErr.Description & "," & CStr(m_adoErr.NativeError) _ & ", & CStr(m_adoErr.Number) & "," & m_adoErr.Source _ & "," & CStr(m_adoErr.SQLState) Next hFile = FreeFile If Len (strLogPath) = 0 Then strLogPath = "C:\temp\" End If expFile = strLogPath & strAppName & ".err" Open expFile For Append As #hFile Print #hFile,"*************************** *******" Print #hFile, Now() Print#hFile, "****************************** ****" Print #hFile,"Subroutine: " & tmpPro Print #hFile, "Error Number:" & gnErrNum Print#hFile, "Error Description: " & gstrErrDesc Print #hFile, "Error Source:" & gstrErrSrc Print # hFile, "Ado error String: " & gstrADOError Print #hFile, "Bad SQL: " & errSQL Close #hFile End Sub Private Sub Class_Initialize() strVersion = "xmlControl Version 1. 1" "title_id,title,type,price,ytd_sales,notes,pubdate gtableName(0) = "titles" gcolumnName(0) = "title_id" gprettyName(0) = "Title Identification Number" gdatatype(0) = "number" gfilter(0) = "" gtableName(1) = "titles" gcolumnName(1) = "title" gprettyName(1) = "Title of the Book" gdatatype(1) = "text" gfilter(1) = "" gtableName (2) = "titles" gcolumnName(2) = "type" gprettyName(2) = "Type of Book" gdatatype(2) = "text" gfilter(2) = "" gtableName(3) = "titles" gcolumnName( 3) = "price" gprettyName(3) = "Price of the Book" gdatatype(3) = "number" gfilter(3) = "" gtableName(4) = "titles" gcolumnName(4) = "ytd_sales" gprettyName( 4) = "Year to date sales" gdatatype(4) = "number" gfilter(4) = "" gtableName(5) = "titles" gcolumnName(5) = "notes" gprettyName(5) = "Notes about the book gdatatype(5) = "memo" gfilter(5) = "" gtableName(6) = "titles" gcolumnName(6) = "pubdate" gprettyName(6) = "Date Published" gdatatype(6) = "date" gfilter (6) = "" End Sub

Лістинг 4 - Тестовий додаток на VB для перевірки WebClass

Private Sub Command1_Click() Dim objWC As xmlControl Dim xml As String Set objWC = New xmlControl objWC.strDatabase = "pubs" objWC.strServer = "ltweb" objWC.strUser = "sa" objWC.strPassword = "" objWC.lMSADO = Option2 .Value objWC.strAppName = "Article1" Text1.Text = objWC.getTitlesXML End Sub

Лістинг 5 - ASP для тестування WebClass

XML - дуже популярний та гнучкий формат у наш час. Кожен програміст повинен розуміти його, це просто must have. Багато технологій зав'язані сьогодні активно його використовують, причому сучасні серед них.

Вступ

Здрастуйте, дорогі читачі моєї статті. Відразу хочу сказати, що це лише перша стаття у моєму циклі з трьох статей. Основна мета всього циклу – присвятити кожного читача в XML і дати, якщо не повне роз'яснення та розуміння, то хоча б хороший такий поштовх до нього, пояснивши основні моменти та речі. Весь цикл буде для однієї номінації – «Увага до деталей», а поділ на 3 статті зроблено для того, щоб вміщатися в ліміт символів у постах та розділити велику кількість матеріалу на більш маленькі порції для більшого розуміння. Перша стаття буде присвячена самому XML і що це таке, а також одному із способів складання схеми для XML файлів – DTD. Для початку, хотілося б висловити невелику передмову для тих, хто взагалі ще не знайомий з XML: не треба лякатися. XML не дуже складний і з ним потрібно розібратися будь-якому програмісту, тому що це дуже гнучкий, ефективний і популярний формат файлів на сьогодні для зберігання різноманітної інформації, яку ви тільки захочете. XML використовується в Ant, Maven, Spring. Будь-якому програмісту потрібне знання XML. Тепер, коли ви зібралися силами та мотивацією, давайте приступати до вивчення. Весь матеріал я намагатимуся викласти максимально просто, зібравши тільки найважливіше і не вдаватися в нетрі.

XML

Для більш ясного пояснення, правильніше візуалізувати XML прикладом.< ? xml version= "1.0" encoding= "UTF-8" ? > < company> < name> IT- Heaven< / name> < offices> < office floor= "1" room= "1" > < employees> < employee> < name> Maksim< / name> < job> Middle Software Developer< / job> < / employee> < employee> < name> Ivan< / name> < job> Junior Software Developer< / job> < / employee> < employee> < name> Franklin< / name> < job> Junior Software Developer< / job> < / employee> < / employees> < / office> < office floor= "1" room= "2" > < employees> < employee> < name> Herald< / name> < job> Middle Software Developer< / job> < / employee> < employee> < name> Adam< / name> < job> Middle Software Developer< / job> < / employee> < employee> < name> Leroy< / name> < job> Junior Software Developer< / job> < / employee> < / employees> < / office> < / offices> < / company>HTML і XML схожі синтаксисом, оскільки вони мають спільний батько – SGML. Однак, у HTML є тільки фіксовані теги конкретного стандарту, в той час як у XML ви можете створювати свої власні теги, атрибути і, в цілому, робити все, що захочете, щоб зберігати дані так, як вам буде зручно. По суті, XML файли може прочитати будь-яка людина, яка знає англійську мову. Зобразити цей приклад можна за допомогою дерева. Корінь дерева- Company. Він же - кореневий (рут) елемент, від якого йдуть всі інші елементи. У кожному XML файлі може бути лише один рут елемент.Він повинен оголошуватися після декларації xml файлу(перший рядок у прикладі) і вміщувати у собі всі інші елементи. Трохи про декларацію: вона обов'язковата потрібна для ідентифікації документа як XML. Вона має три псевдо-атрибути (спеціальні зумовлені атрибути): version (за стандартом 1.0), encoding (кодування) і standalone (автономність: якщо yes і до документа підключаються зовнішні схеми, буде помилка, за умовчанням - no). Елементи– це сутності, які зберігають дані за допомогою інших елементів та атрибутів. Атрибути– це додаткова інформація про елемент, який вказується під час додавання елемента. Якщо перекласти пояснення на ООП-полі, то можна навести такий приклад: у нас є машина, у кожної машини є характеристики (колір, місткість, марка та інше) – це атрибути, і є сутності, які всередині машини: двері, вікна, двигун кермо - це інші елементи. Зберігати властивості можна як окремими елементами, так і атрибутами в залежності від вашого бажання. Як ні, XML - вкрай гнучкий формат зберігання даних про що-небудь. Після пояснень нам достатньо розібрати приклад вище, щоб усе стало на свої місця. У прикладі ми описали просту структуру компанії: є компанія, яка має ім'я та офіси, а в офісах є співробітники. Елементи Employees і Offices – елементи обгортки – вони служать для того, щоб зібрати в собі елементи одного виду, по суті, з'єднавши їх в одну множину для зручності їх обробки. На окрему увагу заслуговують floor і room. Це – атрибути офісу (поверх і номер), тобто його властивості. Якби ми мали елемент «картинка», можна було б передавати її розміри. Ви можете помітити, що компанія не має атрибута name, але є елемент name. Просто ви можете описувати структури так, як захочете. Ніхто не зобов'язує вас усі властивості елементів записувати тільки в атрибути, ви можете використовувати просто елементи і записувати всередині них якісь дані. Наприклад, ми можемо записувати ім'я та посаду наших працівників як атрибути:< ? xml version= "1.0" encoding= "UTF-8" ? > < company> < name> IT- Heaven< / name> < offices> < office floor= "1" room= "1" > < employees> < employee name= "Maksim" job= "Middle Software Developer" > < / employee> < employee name= "Ivan" job= "Junior Software Developer" > < / employee> < employee name= "Franklin" job= "Junior Software Developer" > < / employee> < / employees> < / office> < office floor= "1" room= "2" > < employees> < employee name= "Herald" job= "Middle Software Developer" > < / employee> < employee name= "Adam" job= "Middle Software Developer" > < / employee> < employee name= "Leroy" job= "Junior Software Developer" > < / employee> < / employees> < / office> < / offices> < / company>Як ви бачите, тепер ім'я та посада кожного працівника – це його атрибути. І можна побачити, що всередині сутності (тега) employee нічого немає, всі елементи employee – порожні. Тоді можна зробити employee порожнім елементом – закрити його одразу після оголошення атрибутів. Це робиться досить просто, досить просто поставити слеш:< ? xml version= "1.0" encoding= "UTF-8" ? > < company> < name> IT- Heaven< / name> < offices> < office floor= "1" room= "1" > < employees> < employee name= "Maksim" job= "Middle Software Developer" / > < employee name= "Ivan" job= "Junior Software Developer" / > < employee name= "Franklin" job= "Junior Software Developer" / > < / employees> < / office> < office floor= "1" room= "2" > < employees> < employee name= "Herald" job= "Middle Software Developer" / > < employee name= "Adam" job= "Middle Software Developer" / > < employee name= "Leroy" job= "Junior Software Developer" / > < / employees> < / office> < / offices> < / company>Як ви можете помітити, закривши порожні елементи, ми зберегли всю цілісність інформації і набагато скоротили запис, зробивши інформацію стислішою і читабельнішою. Для того, щоб додати коментар(текст, який буде пропускатися при парсингу файлу) у XML, є наступний синтаксис:< ! -- Иван недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка. -- >І остання конструкція – це CDATA означає «символьні дані». Завдяки даній конструкції можна записувати текст, який не буде інтерпретуватися як розмітка XML. Це корисно, якщо всередині файлу XML у вас є сутність, яка зберігає в інформації XML розмітку. Приклад:< ? xml version= "1.0" encoding= "UTF-8" ? > < bean> < information> < ! [ CDATA[ < name> Ivan< / name> < age> 26 < / age> ] ] > < / information> < / bean>Особливість XML в тому, що ви можете розширювати його так, як захочете використовувати свої елементи, свої атрибути і структурувати його за своїм бажанням. Ви можете використовувати для зберігання даних як атрибути, так і елементи (як це було показано на прикладі раніше). Однак потрібно розуміти, що вигадувати свої елементи та атрибути на ходу і як ви захочете ви можете, але що, якщо ви працюватимете на проекті, де інший програміст захоче перенести елемент name в атрибути, а у вас вся логіка програми написана так, щоб name був елементом? Як створити свої власні правила того, які елементи повинні бути, які атрибути у них є й інші речі, щоб можна було проводити валідацію XML файлів і бути впевненим, що правила стануть стандартними у вашому проекті і ніхто їх порушувати не буде? Для того, щоб написати всі правила вашої власної розмітки XML, є спеціальні засоби. Найвідоміші: DTD та XML Schema. У цій статті буде лише про перше.

DTD

DTD створено для того, щоб описувати типи документів. DTD вже старіє і зараз від нього активно відмовляються в XML, проте ще багато XML файлів використовують саме DTD і, загалом, його корисно розуміти. DTD – це технологія валідації XML-документів. DTD оголошує конкретні правила для типу документа: його елементи, які елементи можуть бути всередині елемента, атрибути, обов'язкові вони чи ні, кількість їх повторень, а також сутності (Entity). За аналогією з XML, для більш чіткого пояснення DTD можна візуалізувати прикладом.< ! -- Объявление возможных элементов -- > < ! ELEMENT employee EMPTY> < ! ELEMENT employees (employee+ ) > < ! ELEMENT office (employees) > < ! ELEMENT offices (office+ ) > < ! ELEMENT name (#PCDATA) > < ! ELEMENT company (name, offices) > < ! -- Добавление атрибутов для элементов employee и office -- > < ! ATTLIST employee name CDATA #REQUIRED job CDATA #REQUIRED > < ! ATTLIST office floor CDATA #REQUIRED room CDATA #REQUIRED > < ! -- Добавление сущностей -- > < ! ENTITY M "Maksim" > < ! ENTITY I "Ivan" > < ! ENTITY F "Franklin" >Ось такий простий приклад у нас є. У цьому прикладі ми оголосили всю нашу ієрархію з прикладу XML: працівник, працівники, офіс, офіси, ім'я, компанія. Для створення DTD файлів служать 3 основні конструкції, щоб описувати будь-які файли XML: ELEMENT (для опису елементів), ATTLIST (для опису атрибутів для елементів) і ENTITY (для підстановки тексту скороченими формами). ELEMENTСлужить для опису елемента. Елементи, які можна використовувати всередині описаного елемента, перераховуються у дужках у вигляді списку. Можна використовувати квантифікатори для вказівки кількості (вони аналогічні квантифікаторам з регулярних виразів): + означає 1 + * означає 0 +? означає 0 АБО 1 Якщо квантифікаторів не було додано, то вважається, що має бути лише один елемент.Якби нам потрібен був один із групи елементів, можна було б написати так:< ! ELEMENT company ((name | offices) ) >Тоді вибирався б один із елементів: name або offices, але якби всередині company було відразу два їх, то валідація б не проходила. Також можна помітити, що у employee є слово EMPTY – це означає, що елемент має бути порожнім. Є ще ANY – будь-які елементи. #PCDATA - Текстові дані. ATTLISTСлужить, щоб додати атрибути до елементів. Після ATTLIST слід назва потрібного елемента, а після словник виду «назва атрибута – тип атрибута», а наприкінці можна додати #IMPLIED (не обов'язковий) або #REQUIRED (обов'язковий). CDATA – текстові дані. Є й інші типи, проте всі вони малі. ENTITY ENTITY служить для оголошення скорочень та тексту, який на них підставлятиметься. По суті ми просто зможемо використовувати в XML замість повного тексту просто назву сутності зі знаком & перед і; після. Наприклад: щоб відрізняти розмітку в HTML і просто символи, ліву кутову скоби часто екранують за допомогою lt; тільки потрібно ще виставити & перед lt. Тоді ми використовуватимемо не розмітку, а просто символ< . Как вы можете видеть, все довольно просто: объявляете элементы, объясняете, какие элементы объявленные элементы способны содержать, добавление атрибутов этим элементам и, по желанию, можете добавить сущности, чтобы сокращать какие-то записи. И тут вы должны были бы спросить: а как использовать наши правила в нашем XML файле? Ведь мы просто объявили правила, но мы не использовали их в XML. Є два способи використовувати їх у XML: 1. Впровадження - написання DTD правил усередині самого XML файлу, досить просто написати кореневий елемент після ключового слова DOCTYPE і укласти наш DTD файл усередині квадратних дужок. < ? xml version= "1.0" encoding= "UTF-8" ? > < ! DOCTYPE company [ < ! -- Объявление возможных элементов -- > < ! ELEMENT employee EMPTY> < ! ELEMENT employees (employee+ ) > < ! ELEMENT office (employees) > < ! ELEMENT offices (office+ ) > < ! ELEMENT name (#PCDATA) > < ! ELEMENT company (name, offices) > < ! -- Добавление атрибутов для элементов employee и office -- > < ! ATTLIST employee name CDATA #REQUIRED job CDATA #REQUIRED > < ! ATTLIST office floor CDATA #REQUIRED room CDATA #REQUIRED > < ! -- Добавление сущностей -- > < ! ENTITY M "Maksim" > < ! ENTITY I "Ivan" > < ! ENTITY F "Franklin" > ] > < company> < name> IT- Heaven< / name> < ! -- Иван недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка. -- > < offices> < office floor= "1" room= "1" > < employees> < employee name= "&M;" job= "Middle Software Developer" / > < employee name= "&I;" job= "Junior Software Developer" / > < employee name= "&F;" job= "Junior Software Developer" / > < / employees> < / office> < office floor= "1" room= "2" > < employees> < employee name= "Herald" job= "Middle Software Developer" / > < employee name= "Adam" job= "Middle Software Developer" / > < employee name= "Leroy" job= "Junior Software Developer" / > < / employees> < / office> < / offices> < / company> 2. Імпорт - ми записуємо всі наші правила в окремий DTD файл, після чого в XML файлі використовуємо DOCTYPE-конструкцію з першого способу, тільки замість квадратних дужок потрібно написати SYSTEM і вказати абсолютний або відносний до поточного розташування файлу шлях. < ? xml version= "1.0" encoding= "UTF-8" ? > < ! DOCTYPE company SYSTEM "dtd_example1.dtd" > < company> < name> IT- Heaven< / name> < ! -- Иван недавно уволился, только неделю отработать должен. Не забудьте потом удалить его из списка. -- > < offices> < office floor= "1" room= "1" > < employees> < employee name= "&M;" job= "Middle Software Developer" / > < employee name= "&I;" job= "Junior Software Developer" / > < employee name= "&F;" job= "Junior Software Developer" / > < / employees> < / office> < office floor= "1" room= "2" > < employees> < employee name= "Herald" job= "Middle Software Developer" / > < employee name= "Adam" job= "Middle Software Developer" / > < employee name= "Leroy" job= "Junior Software Developer" / > < / employees> < / office> < / offices> < / company>Також можна використовувати ключове слово PUBLIC замість SYSTEM, проте воно навряд чи стане вам у пригоді. Якщо цікаво, то почитати про нього (і про SYSTEM теж) можна докладно тут: посилання . Тепер ми не можемо використовувати інші елементи без їхнього оголошення в DTD, а весь XML підпорядковується нашим правилам. Можете спробувати записати цей код в IntelliJ IDEA окремий файлз розширенням.xml і спробувати додати нові елементи або видалити елемент з нашого DTD і помітити, як IDE буде вказувати вам на помилку. Однак, DTD має свої мінуси:
  • Він має власний синтаксис, відмінний від синтаксису xml.
  • У DTD немає перевірки типів даних, а містити він може лише рядки.
  • DTD не має простору імен.
Про проблему власного синтаксису: ви повинні розбиратися у двох синтаксисах відразу: у XML та DTD синтаксисі. Вони різні, і це може змушувати вас плутатися. Так само, через це складніше відстежувати помилки у величезних XML файлах у поєднанні з такими ж DTD схемами. Якщо у вас щось не запрацювало, доводиться перевіряти величезну кількість текстів різних синтаксисів. Це як читати одночасно дві книжки: російською та англійською. І якщо знання в однієї мови у вас гірше, то розуміти текст буде так само складніше. Про проблему перевірки типів даних: атрибути в DTD дійсно мають різні типи, але всі вони, по суті своїй, є рядковими уявленнями чогось, списками чи посиланнями. Однак, ви не можете вимагати лише числа, і тим більше позитивні чи негативні. А про об'єктні типи можете взагалі забути. Остання проблема буде обговорюватися вже в наступній статті, яка буде присвячена просторам імен та XML схемам, оскільки обговорення її тут безглуздо. Дякую всім за увагу, я зробив велику роботу і продовжую її робити, щоб вчасно закінчити весь цикл статей. По суті, мені залишилося розібратися з XML схемами і вигадати їх пояснення більш ясними словами, щоб закінчити 2-ю статтю. Її половина вже зроблена, тож можете чекати її найближчим часом. Остання стаття буде повністю присвячена роботі з файлами XML засобами Java. Успіхів усім і успіхів у програмуванні:) Наступна стаття:

Сьогодні приступимо до розгляду дуже популярного та зручного мови розмітки XML. Так як даний формат подання даних дуже гнучкий і універсальний, і його можна використовувати практично скрізь, мається на увазі з чимось. Тому програмісту-початківцю рано чи пізно доведеться зіткнутися з цією мовою, і неважливо чим конкретно Ви займаєтеся, будь то web-програмуванням або адмініструванням баз даних, тому що XML використовують усі, і Ви його також використовуватимете в реалізації потрібних Вам завдань.

Починатимемо як завжди з теорії, давайте розглянемо, що ж це за мова, чим вона хороша, як ним користуватися і де її використовують.

Визначення мови XML

XML (eXtensible Markup Language) – універсальна та розширювана мова розмітки даних, яка не залежить від операційної системи та середовища обробки. Xml служить для представлення деяких даних у вигляді структури, і цю структуру Ви можете самі розробити або підлаштувати під ту чи іншу програму чи сервіс. Саме тому дана мованазивають розширюваний, і в цьому є його головна перевага, за яку його так цінують.

Як Ви знаєте, мов розмітки існує досить багато, наприклад, мова HTML, але всі вони, так чи інакше, залежать від обробника, наприклад, той же html, код якого парсить браузер, є стандартизованим і не розширюється, там є чіткі теги, синтаксис який не можна порушувати, а xml Ви можете самі створювати свої теги, тобто. свою розмітку. Головною відмінністю HTML і XML є те, що html лише описує розмітку для відображення даних, а xml - це абстрактна структура даних, яку можна обробити і відобразити як завгодно і де завгодно і тому порівнювати ці мови не потрібно, у них абсолютно різне призначення.

Як уже відзначилося вище xml дуже поширена і універсальна мова, за допомогою якої практично всі додатки, як web, так і просто для комп'ютера використовують його як обмін інформації, так як за допомогою нього можна дуже легко обмінюватися даними між додатками або сервісами, які навіть написані на різних мовах. У зв'язку з чим, кожен програміст-початківець, який займається абсолютно будь-яким програмуванням, повинен мати уявлення про XML. Якщо Ви хочете стати web-майстром, то Ви просто повинні знати XML, а як стати WEB Майстром і що для цього потрібно знати, ми з Вами вже розглядали.

Наприклад, у мене одного разу постало завдання написати якийсь сервіс, який повинен на запит повертати дані у вигляді xml, тобто. свого роду розробити серверну частину програми, а я навіть поняття не мав, на чому написаний клієнт, який оброблятиме ці дані, і що, я написав сервіс, який повертав дані у вигляді xml і все, додаток працював відмінно. І це тільки приклад, з яким мені довелося зіткнутися, а тепер уявіть, скільки різних організацій співпрацює і соромно розробляють програмне забезпечення та обмінюються даними, і я не здивуюся, що ці дані будуть у вигляді xml.

Наприклад, у мене одного разу було завдання написати якийсь сервіс, який повинен на запит повертати дані у вигляді xml, тобто. свого роду розробити серверну частину програми, а я навіть поняття не мав, на чому написаний клієнт, який оброблятиме ці дані, і що, я написав сервіс, який повертав дані у вигляді xml і все, додаток працював відмінно. І це тільки приклад, з яким мені довелося зіткнутися, а тепер уявіть, скільки різних організацій співпрацює і соромно розробляють програмне забезпечення та обмінюються даними, і я не здивуюся, що ці дані будуть у вигляді xml.

Також мені один раз довелося зберігати дані xml в базі MS SQL 2008, для того щоб краще представляти ці дані і обмінюватися ними між сервером і клієнтською частиною програми, це ми розглядали в статті - Transact-sql - робота з xml.

Сама по собі мова XML дуже проста, і заплутатися в ній просто не можна, вся складність виникає саме в обробці та взаємодії xml з іншими додатками, технологіями, тобто. всім тим, що оточує xml, у чомусь і можна легко заплутатися.

Сьогодні ми з Вами розмовляємо поки що лише про основи XML, і загострювати увагу на технологіях обробки та взаємодії з цією мовою ми не будемо, оскільки це правда, дуже об'ємний матеріал, але я думаю, надалі ми продовжимо знайомитись із супутніми технологіями.

Переходимо до практики. І всі приклади, які ми розглядатимемо, я писатиму в Notepad++ тільки тому, що він дуже зручний, але зараз не про це говоритимемо, оскільки ми вже це розглядали в статті — Чим хороший Notepad++ для розробника-початківця.

XML теги

Мова XML для розмітки використовує теги ( теги реєстрозалежні), але не такі теги як у html, а ті, які Ви придумаєте самі, але xml документ має також чітку структуру, тобто. є тег, що відкриває і закриває, є вкладені теги і є, звичайно ж, значення, які розташовані в цих тегах. Іншими словами, все, що потрібно для початкових знань xml – це просто дотримуватись цих правил. Все разом відкриває, що закриває тег і значення називається елементом і весь XML документ складається саме з елементів, які утворюють структуру даних. У XML документа може бути тільки один кореневий елемент, це запам'ятайте, оскільки якщо Ви напишите два кореневих елементи, то це буде помилка.

І настав час навести приклад xml розмітки, і перший приклад поки що для синтаксису:

<Начало элемента> <Начало вложенного элемента>Значення вкладеного елемента

Як бачите все досить просто, і таких вкладених один в одного елементів може бути дуже багато.

Тепер давайте наведемо приклад справжнього xml документа:

Як бачите, я просто навів приклад свого роду каталогу книг, але не оголошував цей документ, тобто. не писав XML декларацію, яка говорить додатку, який оброблятиме ці дані, що тут розташовані дані саме xml і в якому кодуванні вони представлені. Також можна писати коментарі та атрибути, так давайте наведемо приклад такого документа:

Книга 1 Іван Просто книга 1 Книга 2 Сергій Просто книга 2 Книга 3 Роман Просто книга 3

Де перший рядок і є оголошення декларації про те, що це документ XMLта його необхідно читати у кодуванні UTF-8.

Ці дані без обробки будуть виглядати, наприклад, у браузері ( Mozilla Firefox) наступним чином:

Сподіваюся, Ви розумієте, що тут catalog - це кореневий елемент, який складається з елементів book, який у свою чергу складається з елементів name, author і comment, також для прикладу я поставив кілька атрибутів елемента catalog і елемента book.

Для основ я думаю достатньо, тому що якщо ми будемо все глибше і глибше занурюватися в XML, і у всі технології, пов'язані з цією мовою, тоді ця стаття ніколи не закінчиться. Тож на сьогодні це все. Поки що!

XML був створений для опису даних з прицілом на те, що являють собою дані.

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

Що таке XML?

  • XML розшифровується як Розширювана мова розмітки (EXtensible Markup Language)
  • XML - це мова розмітки, схожий на HTML
  • XML був створений для опису даних
  • Теги XML не визначені. Ви можете використовувати свої теги
  • XML використовує Визначення типу документа (Document Type Definition — DTD)або схему XML (XML Schema)для опису даних
  • XML рекомендований W3С

Головна різниця між XML та HTML

XML було розроблено передачі даних.

XML не є заміною HTML.

XML та HTML були розроблені з різними цілями:

  • XML був створений для опису даних і основна увага приділяється тому, які дані передаються
  • HTML був розроблений для відображення даних основна увага приділяється відображенню даних
  • Таким чином, HTML більше пов'язаний з відображенням інформації, у той час як XML є описом інформації.

XML нічого не робить

XML не було створено для виконання будь-яких дій.

Можливо, це буде непросто зрозуміти, але XML не виконує жодних дій. Ця мова розмітки була створена для структурування, зберігання та передачі інформації. Наступний приклад є запискою від Антона Ірі, представленою в XML:

Іра

Anton

Нагадування

Не забудь про зустріч цього тижня!

Як бачите, мова XML дуже лаконічна.

Записка ( ) складається із заголовка ( ) та вмісту ( ) листи. У ній вказані відправник (тег — «від кого лист») та одержувач (тег - "Кому"). Але цей лист нічого не робить. Це чиста інформація, загорнута у теги. Для того, щоб надіслати, отримати та відобразити цю інформацію, хтось має написати програму.

XML — вільна мова розмітки, що розширюється.

Теги XML не визначені. Ви можете вводити свої теги.

Теги та структура документа в HTML задані заздалегідь. Автор HTML-документа може тільки використовувати теги, визначені стандартами.

XML дозволяє вводити свої теги та структуру документа автору XML-документу. Теги, наведені у прикладі (наприклад, і ) не визначено стандартом XML. Ці теги введено автором документа.

XML є доповненням HTML

XML – це не заміна HTML.

Важливо зрозуміти, що XML не є заміною HTML. У майбутньому веб-розробники будуть використовувати XML для опису даних, в той час як HTML буде використовуватися для форматування та відображення цих даних.

Моє найкраще визначення XML таке: XML - це кроссплатформенний, не залежить від програмного та апаратного забезпечення інструмент передачі інформації.

Нотатка:Кросплатформовий - придатний для будь-якої операційної системи та будь-якого апаратного забезпечення.

Якщо ви знаєте, існують різні операційні системикрім знайомої нам Windows. Це ОС Linux, Mac та інші.

Щодо апаратного забезпечення можна сказати таке: це можуть бути звичайні ПК, ноутбуки, кишенькові комп'ютери тощо.

XML у майбутній веб-розробці

XML буде використовуватися скрізь.

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