Інтернет Windows Android

Використання XML в середовищі Delphi. Використання XML Document Object Model Створення xml в delphi xe нальоту

Ласкаво просимо! Цей блог присвячений інтернету і комп'ютерам, а, точніше був їм присвячений.

Напевно, відразу видно, що вже багато років на сайті не з'являлося нових статей. Так, така доля більшості блогів. Колись цей проект був амбітним починанням, і у автора, як і у багатьох інших, які писали в той час, були масштабні плани стати одним з кращих російських блогерів. Що ж, якщо зараз подивитися, то з тих блогів, що створювалися одночасно з моїм, більшість вже розчинилося в вічності. І у мене банально стало не вистачати часу на блог. Так що так, він більше не оновлюється. Хоча колись ми з цим сайтом виграли в конкурсі "Блог рунета 2011".

У мене навіть була думка видалити все це, але потім я переглянув старі матеріали, і зрозумів, що вони все ще можуть бути корисні читачам. Так, деякі статті застаріли (якщо у мене вистачить сил, то вони отримають відповідні позначки), але сайт, наприклад, може бути корисний початківцям - тут можна прочитати про базові поняття інтернету, навчитися налаштовувати інтернет, Windows або навіть зважитися перейти на Linux. Так що подивіться на рубрики і виберіть ту, яка підійде саме вам.

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

Сандер

Picodi.ru - це дисконтний портал від компанії International Coupons, польського експерта в області економії і дешевих покупок. Поляки вважаються однією з найбільш економних націй на світі, тому не дивно, що такого типу проект виріс саме з польського стартапу kodyrabatowe.pl. Чим може стати в нагоді цей портал пересічному користувачеві інтернету в Росії?

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

Більшість з читачів цього блогу, скоріше за все, ніколи з системами контролю версій не стикалися і найближчим часом не зіткнуться. А шкода. Це надзвичайно зручний винахід досить широко використовується програмістами, але, на мій погляд, могло б стати в нагоді і тим, хто активно працює з текстами. Але, напевно, зараз немає жодної системи контролю версій, яку було б легко почати використовувати для "офісної" (Microsoft Office) роботи. Проте, на мою думку, що матеріал, викладений у статті, може бути цікавим для всіх читачів.

Якщо ви замислювалися про те, як з вашого телевізора дивитися фільми по мережі і виходити в інтернет, ця стаття для вас. Ні, я знаю про те, що у деяких телевізорів і так є функціональність Smart TV, однак я ні разу не бачив, щоб вона працювала нормально. Мабуть тому нещодавно корпорація Google продемонструвала абсолютно приголомшливе пристрій, негайно стало сенсацією. Йдеться про медіа-стример Chromecast (Хромкаст), більш досконалої та доступної версії торішнього провального плеєра Nexus Q.

Донгл Хромкаст, розміри якого не перевищують 2 дюймів, підключається до порту HDMI телевізора і дозволяє насолоджуватися переглядом потокового веб-контенту. Для управління стримером можна використовувати будь-який пристрій (планшет, ПК, смартфон) базується на операційній платформі iOS, Windows, Android або Mac OS.

Ця стаття присвячена влаштуванню системної пам'яті android, проблемам, які можуть виникати через її нестачі і способам їх вирішення. Я сам не так давно зіткнувся з тим, що мій телефон на базі android став регулярно видавати повідомлення про брак пам'яті при спробі встановити ту чи іншу програму. Що було для мене дуже дивно при тому, що за описом на маркеті там повинно було бути близько 16GB, та ще й я збільшив цей обсяг за допомогою додаткової картки пам'яті. Однак проблема була, і довелося добряче повозитися, перше ніж я знайшов правильне рішення, яке не потребує отримання root-доступу або повного відновлення телефону до заводського стан.

Останнім часом багато уваги приділяється побудови систем електронного бізнесу, або як їх ще називають - B2B (business to business). З огляду на рекомендації з побудови обмінних потокових систем координуючого інтернет-технологій органу - WWW Consortium: акцент зроблений в сторону XML-технологій і побудова систем обміну XML-документами.

Перевага використання XML в електронному бізнесі - висока ефективність B2B систем при низьких витратах на її створення за рахунок чіткого і наочного уявлення структурованої інформації, можливість використання сучасних мережевих протоколів і створення бізнес-систем реального часу.

Незалежність подання інформації у вигляді XML документів дозволяє різним, які беруть участь в електронному бізнесі, фірмам виробляти незалежне один від одного ПО.

У всіх системах обмін, як правило, будується за однаковою схемою, з використанням HTTP запитів. Як протоколу захисту інформації застосовується протокол SSL (але це окрема тема).

Один з можливих варіантів обробки XML повідомлення є побудова BIN / CGI (ISAPI)-додатків або COM (серверних) компонент, що формують або обробних XML-документи.

З одного боку, додаток виступає в якості клієнта, яке в режимі POST видає HTTP запит, з іншого боку, знаходиться WEB сервер на боці якого здійснюється обробка запиту та видача відповіді. В інформаційному обміні використовуються XML-документи.

Один з найбільш ефективних варіантів реалізації - використання існуючого XML-парсера, що підтримує DOM модель. Такий парсер є дистрибутивної поставкою Win`98 або складовою частиною IE 4,7 і вище (для Win`95) і являє COM сервер, що знаходиться в бібліотеці msxml.dll.

Модель компонентних об'єктів (COM) - являє інкапсульовані дані і методи в єдину сутність і спосіб доступу до них через систему інтерфейсів. Засобами Delphi досить просто здійснити доступ до класів COM-об'єкта (в одному COM-сервер може бути включено декілька класів). Доступ до об'єктів здійснюється шляхом ініціалізації екземпляра класу через систему інтерфейсів. Опис інтерфейсів здійснюється мовою визначення інтерфейсів (IDL), яке можливо здійснити засобами середовища автоматично.

Засобами Delphi здійснюється імпорт з COM-сервера msxml.dll, Будується файли опису інтерфейсу IDL і файл бінарного опису типів бібліотеки - TLB. Дана операція здійснюється через системне меню: Project | Type Library Import:(малюнок 1). Далі з'являється діалогове вікно (малюнок 2), в якому необхідно вибрати COM-об'єкт (в нашому випадку об'єкт зареєстрований під ім'ям "Microsoft.XMLDom (Version 2.0)") і створити TLB-файл (кнопка Create Unit). Використовуючи TLB-файл, середа генерує "паскалевская" файл опису COM-сервера - MSXML_TLB.pas

У файлі MSXML_TLB.pas описані всі інтерфейси, константи і сокласси COM-сервера.

Для доступу до об'єктів COM-елемента, необхідно в директиві USESдодати ім'я файлу опису бібліотеки (MSXML_TLB.pas). Нижче представлена \u200b\u200bнайпростіша програма, яка використовує DOM стандартний аналізатор msxml.dll, яка завантажує XML-документ і відображає його в елементі текстового поля Memo1.

uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, OleServer, MSXML_TLB, StdCtrls; type TForm1 \u003d class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click (Sender: TObject); end; var Form1: TForm1; implementation ($ R * .DFM) ProcedureTForm1.Button1Click (Sender: Tobject); // оголошення сокласса об'єкта DOMDocument; varcoDoc: CoDOMDocument; // клас, узгоджений з інтерфейсом IDOMDocument; varDoc: IXMLDOMDocument; begin // створення екземпляра об'єкта DOMDocument; Doc: \u003d coDoc.Create; // виклик методу Load примірника об'єкта DOMDocument; Doc.load ( "data.xml"); // доступ до властивості xml примірника об'єкта DOMDocument; Memo1.Text: \u003d Doc.xml; end; end.

Концепція DOM - об'єктна модель документа

Кожен XML документ представляється у вигляді набору безлічі об'єктів (класів), за допомогою яких можливий доступ до окремих елементів (полів об'єкта). DOM - інтерфейс описує доступ як до простих об'єктів типу DOMString або CharacterData, так і на частини та окремих елементах XML документа: DOMFragmentElement, DOMNode, DOMElement.

Нижче наведені найважливіші властивості і методи об'єктів XMLDOMDocument, XMLDOMNode, XMLDOMNodeList. Необхідно відзначити, що представлені нижче методи і функції об'єктів DOM моделі (Document Object Model) використовуються Microsoft XML-аналізатором msxml.dll і трохи ширше, ніж затверджена W3C Консорціумом DOM модель.

Більш повний опис інтерфейсу DOM об'єктів можна знайти на

об'єкт XMLDOMDocument
Представляє верхній рівень об'єктної ієрархії і містить методи для роботи з документом: його завантаження, аналізу, створення в ньому елементів, атрибутів, коментарів і т.д. .
властивості
Async Властивість ідентифікує поточний режим обробки
ParseError Повертає посилання на об'єкт обробки помилки XMLDOMParseError
Включення - вимикання верифікації документа.
url Повертає URL документа
documentElement Містить посилання на кореневий елемент документа у вигляді об'єкта XMLDOMElement.
методи
load (url)
loadXML (xmlString)
Завантажує XML документ,
save (objTarget) Зберігає XML документ в файлі
abort Переривання процесу завантаження і обробки документа.
createAttribute (name) Створює для поточного елемента новий атрибут з вказаним ім'ям.
createNode (Type, name, nameSpaceURI) Створює вузол зазначеного типу і назви
createElement (tagName) Створює елемент документа з вказаною назвою.
createTextNode (data) Створює текст всередині документа
getElementsByTagName (tagname) Повертає посилання на колекцію елементів документа з заданим ім'ям
nodeFromID (idString) Пошук елемента за ідентифікатором

об'єкт XMLDOMNode
Об'єкт XMLDOMNode, який реалізує базовий DOM інтерфейс Node, Призначений для маніпулювання з окремим вузлом дерева документа. Його властивості та методи дозволяють отримувати і змінювати повну інформацію про поточний вузлі - його тип, назва, повна назва, його вміст, список дочірніх елементів і т.д.
властивості
nodeName, baseName Повертає назву поточного вузла.
prefix Повертає Namespace префікс.
dataType Визначає тип вмісту поточного вузла
nodeType, nodeTypeString Повертає тип поточного вузла:
attributes Повертає список атрибутів поточного вузла у вигляді колекції XMLDOMNamedNodeMap.
text Повертає вміст поточного поддерева у вигляді тексту
xml Повертає XML-представлення поточного поддерева.
nodeValue Повертає вміст поточного вузла.
childNodes Повертає список дочірніх елементів у вигляді XMLDOMNodeList.
firstChild, lastChild Повертає перший / останній дочірній елемент
previousSibling, nextSibling Повертає попередній / наступний сестринський елемент.
parentNode Містить посилання на батьківський елемент.
ownerDocument Повертає покажчик на документ, в якому знаходиться поточний вузол.
методи
appendChild (newChild) Додає поточному вузлу новий дочірній елемент.
insertBefore (newChild, refChild) Вставляє дочірній вузол, маючи в своєму розпорядженні його в поточному поддереве "лівіше" вузла, вказаного параметром refChild.
cloneNode (deep) Створення копії поточного елемента.
getAttribute(Name)
getAttributeNode (Name)
setAttribute (name, value)
setAttributeNode (XMLDOMAttribute)
Доступ до атрибутів (створення, читання, запис) об'єкта. Name - ім'я атрибута, value - його значення. Повертає значення об'єкт XMLDOMAttribute.
replaceChild (newChild, oldChild) removeChild (oldChild) Заміна об'єкта oldChild поточного списку дочірніх об'єктів на newChild. Видалення об'єкта oldChild
selectNodes (patternString) selectSingleNode (patternString) Повертає об'єкт XMLDOMNodeList, вбрання за шаблоном пошуку або перший вузол
transformNode (stylesheet)
transformNodeToObject (stylesheet, outputObject)
Призначає стильову таблицю для піддереві поточного вузла і повертає рядок - результат обробки. Як параметр передається посилання на об'єкт DOMDocument, в якому знаходяться XSL інструкції.

Використання XML в бізнесі.

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

При побудові B2B або корпоративної ERP системи, при організації інформаційного обміну XML-документами між підприємствами або філіями пр-я, використовуються ефективно себе зарекомендувала система передачі інформації на основі наявних WEB серверів по HTTP протоколах.

З одного боку, додаток виступає в якості клієнта, яке в режимі POST видає HTTP запит, з іншого боку, знаходиться WEB сервер, на стороні якого здійснюється обробка запиту та видача відповіді. Як обміну використовуються XML-документи.

Наприклад, в простій корпоративної ERP системі бухгалтерській програмі (АСУ Бухоблік) необхідно сформувати якийсь запит на виписку накладної та передати його до філії, який має склад (АСУ Склад). АРМ Аналогічна постановка завдання при створенні В2В системи, коли Підприємство А запитує наявність продукції (за замовленням на придбання) у Постачальника В.

Підприємство А і його програма виступає в якості клієнта. Склад обслуговує Постачальник В, у якого знаходиться складський комплекс БД на SQL сервері. Обмін здійснюється через корпоративний WEB сервер Постачальника В.

Нижче представлений наступний типовий алгоритм обміну:


Малюнок 3.
  1. підприємство Аініціює процес А(Замовлення продукції), який виступає в якості WEB-клієнта.
  2. процес Аформує XML документ (наприклад запрос- накладна) і передає його як POST запит http на WEB сервер Постачальника В. Як URI - використовується ідентифікатор ресурсу обробного додатки. URI може бути однаковим як для всіх типів документів, або індивідуальним для кожного типу. Все залежить від структури B2B (WEB) сервера.
  3. WEB сервер аналізує запит і породжує серверний процес В, Передаючи в якості параметра тіло XML документа.
    Процесі В запускається WEB-сервером і обробляється або як ASP сторінка, CGI (ISAPI) - додаток або JAVA севрлет (серверний додаток)
  4. процес В- формує запит на SQL-сервер бази даних.
  5. SQL-сервер робить необхідні операції в БД, формує відповідь і повертає його процесу У.
  6. По відповіді від SQL-сервера процес В формує XML документ (відповідь) і вирощує як на відповідь на http запит клієнтського додатку.
  7. Далі, в залежності від ситуації на стороні клієнта формується або новий http запит, або закінчується сеанс.

Кілька слів про організацію документообігу.

Загальним правилом розробки системи обміну XML документами є:

  • по перше- розробка схеми потоків електронних документів і їх структури;
  • по-друге- розробка таблиць функцій процесів (підпроцесів) тобто яку функцію по відношенню до якого XML-документу буде реалізовувати кожен процес.

Кожен XML документ, подібно HTML документу, повинен складатися з заголовка повідомлення (інформація укладена тегами) і тіла повідомлення (для запиту ця інформація обрамлена тегами для відповіді на запит). Для того, щоб XML документ був правильно сформований, необхідно його дві складові частини "Тема" і "Запит" обрамити тегами, наприклад. Вид типового документа представлений нижче:

Тема (Малюнок 4), на відміну HTML документа, повинен містити різного роду службову інформацію, в тому числі інформацію про тип переданого документа і його обробки. В інформаційну обробку надходить тіло документа, тобто змістовна частина обрамлена тегами. Слід зазначити, що структуру заголовків повинна бути єдиною для всіх типів документів.

Для запущеного сервером Процесу, алгоритм обробки переважно (але не обов'язково) будувати в такий спосіб:


Малюнок 6.

Деякі принципові моменти при створенні клієнтської частини

Як вже пояснювалося, при створення XML-документа використовується його подання до вигляді DOM моделі. Нижче наведено приклад частини тексту Delphi програми створення заголовка xml повідомлення.

procedureTThread1.HeaderCreate (Sender: Tobject); var // оголошення сокласса, необхідний для створення coDoc: CoDomDocument; // об'єкта XMLDomDocument Doc: DomDocument; r: IXMLDOMElement; Node: IXMLDOMElement; // DOMText txt: IXMLDOMText; // DOMAttribute attr: IXMLDOMAttribute; begin // створення документа DOM Doc: \u003d coDoc.Create; Doc.Set_async (false); // початкова ініціація DOM документа Doc.LoadXML ( "
"); // створення DOMElement (тег<Sender>) Node: \u003d Doc.createElement ( "Sender"); // створення текстового вузла " ТОВ "Тайфун"" txt: \u003d Doc.createTextNode ( "ТОВ" Тайфун ""); // присвоєння вузла<Sender\u003e значення // текстового вузла " ТОВ "Тайфун"" Node.appendChild (txt); // додавання елемента<Sender\u003e В корінь документа як дочірнього r.appendChild (Node); <From> Node: \u003d Doc.createElement ( "From"); txt: \u003d Doc.createTextNode ( "http://tayfun.ru/xml/default.asp"); Node.appendChild (txt); r.appendChild (Node); // аналогічні операції для тега<To> Node: \u003d Doc.createElement ( "To"); txt: \u003d Doc.createTextNode ( "http://irbis.ru"); Node.appendChild (txt); r.appendChild (Node); // створення DOMElement () Node: \u003d Doc.createElement ( "TypeDocument"); // створення вузла XMLDOMAttribute Att: \u003d Doc.createAttribute ( "Id", "Order"); // Node.appendChild (Att); r.appendChild (Node); end;

Слід зазначити, що оголошення змінної coDoc: CoDomDocument і Doc: DomDocument, а також її створення методом Create (Doc: \u003d coDoc.Create;) здійснюється один раз. Оголошення змінної знаходиться в секції опису глобальних змінних, а не в локальній процедурі, як було продемонстровано для наочності в даному прикладі (тобто одна глобальна змінна типу DomDocument на один програмний модуль).

Результатом роботи вищенаведеної програми буде створений заголовок, стосовно до нашого прикладу xml-документа: зображений на малюнку 5.


Малюнок 5.


Малюнок 6.

Основна перевага передачі інформації у вигляді XML-документів в тому, що існує можливо формувати повідомлення, використовуючи незалежні структури таблиць в СУБД як на прийнятої, так і на переданої стороні. Використовуючи наш приклад, нехай потрібно передати інформацію про інвойсах Підприємства А, з СУБД має структуру, зображену на малюнку 6

Для формування xml-документа, що містить інвойс спочатку будується SQL-запит (запит А) з інформацією про сам інвойсі:

SELECT * FROM Invoice_General WHERE InvoiceNum \u003d: num SELECTGoods, Qulity, Price, HZ_cod FROMGoods WHERE InvoiceNum \u003d: num //: num - параметр, який задає номер інвойсу.

Нижче представлена \u200b\u200bчастина програми, яка формує тіло xml-документа:

procedure TThread1.DataBodyCreate (Sender: Tobject); var // оголошення сокласса і об'єкта XMLDomDocument // coDoc: CoDomDocument; // повинно бути глобальним, для всього модуля. // Doc: DomDocument; // оголошення об'єктів DOMElement r: IXMLDOMElement; // DOMElement; Node, Node2: IXMLDOMElement; Node3, Node4: IXMLDOMElement; // DOMText txt: IXMLDOMText; str: String; // InvoiceNumber: integer; - глобальна змінна - // має значення 987654 // queryA, queryB: String; - глобальна змінна, // має значення, відповідне запитом // queryA - запит А генеральна інформацією про інвойсі // queryB - запит B інформація про товари, що описуються в // інвойсі (див. Текст) begin Query.Close; // см. По тексту "запит А" Query.Text: \u003d queryA; // виконання запиту Query.ExecSQL; Query.Open; // отримання адреси кореневого елемента r: \u003d Doc.Get_documentElement; Node2: \u003d Doc.createElement ( "Request"); // створення DOMElement (тег) Node: \u003d Doc.createElement ( "Invoice"); // додавання елемента в корінь r.appendChild (Node2); // додавання елемента в Node2. appendChild (Node); // створення DOMElement (тег) Node3: \u003d Doc.createElement ( "Depurture"); // додавання елемента в Node. appendChild (Node3); // звернення до полю "Depurture" запиту str: \u003d Query.FieldByName ( "Depurture"). AsString; // створення текстового вузла \u003d значенням поля // привласнення вузлу значення // текстового вузла, змінної str Node.appendChild (txt); // аналогічні операції для тега , , // , // (Поле DB "Consignee") Node: \u003d Doc.createElement ( "Destination"); // ім'я поля БД може і не збігатися з ім'ям str: \u003d Query.FieldByName ( "Consignee") .AsString; // тега, в цьому перевага використання txt: \u003d Doc.createTextNode (str); // DOM інтерфейсу перед СУБД, які мають підтримку XML-інтерфейсу, // типу ORACLE 8i або Ms SQL 2000 Node.appendChild (txt); ... // формування запиту на специфікацію по товарах // закриває запит для доступу Query.Close; // см. По тексту "запит У", інформаці. Про товари Query.Text: \u003d queryВ; // присвоювання значення параметрів Query.Params.AsInteger: \u003d InvoiceNumber; // виконання запиту Query2.ExecSQL; // відкриття доступу до даних запиту Query.Open; // створення DOMElement (тег) Node3: \u003d Doc.createElement ( "Imems"); // додавання елемента в Node. appendChild (Node3); // цикл по всіх рядках запиту while not Eof.Query do begin Node4: \u003d Doc.createElement ( "Imem"); // додавання елемента в Node3.appendChild (Node4); // формування даних для тега str: \u003d Query.FieldByName ( "Price"). AsString; txt: \u003d Doc.createTextNode (str); Node.appendChild (txt); ... // аналогічні операції для тагов , , end; end;

В результаті виконання даної процедури формується наступний текст XML-документа:


Для формування запиту використовується метод Open об'єкта IXMLHttpRequest:

procedure Open (const bstrMethod, - тип методу \u003d "POST" bstrUrl, - Url адресу сервера varAsync, - режим зв'язку асинхронний / синхронний \u003d true bstrUser, - ім'я користувача для аутентифікації bstrPassword) - пароль

Створення серверної частини обробки документа

Як було зазначено раніше, обробка HTTP запиту може здійснюватися або CGI-додатками, або Java-Сервлетами. Можливий і варіант написання ASP-сторінок. Але в цьому випадку передача даних можлива тільки методом "GET" через рядок запиту. Хоча, обробка HTTP запиту ASP-сторінок працює більш ефективніше, ніж CGI-додатком. Однак, на мій погляд, без різниці, як обробляти, а важливіше вирішити питання - як побудувати програму обробки, а не якимись засобами.

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

procedureTthread1.DataParser (Sender: Tobject); var // оголошення об'єктів DOMElement r, FNode: IXMLDOMElement; Str, Filename: String; parm: String; // оголошення сокласса і CoDocXML, CoDocXSL, CoDocResult: CoDomDocument; // об'єкта XMLDomDocument XMLDoc, XSLDoc, ResultDoc: DomDocument; // HttpStr: String; - глобальна змінна, яка містить рядок HTTP запиту Begin XMLDoc: \u003d coDocXML.Create; XMLDoc.LoadXML (HttpStr); // отримання адреси кореневого елемента r: \u003d Doc.Get_documentElement; // отримання значення елемента FNode: \u003d r.SelectSingleNode ( "// TypeDocument"); // отримання значення атрибута id \u003d "Order" FileName: \u003d FNode.GetAttibute ( "id"); // і формування імені файлу Order.xsl FileName: \u003d FileName + ". Xsl"; // створення документа XSLDoc XSLDoc: \u003d coDocXSL.Create; XSLDoc.LoadXML (FileName); // створення документа XMLDoc ResultDoc: \u003d coDocResult.Create; // установка синхронного режиму обробки ResultDoc.Set_async (false); // установка перевірки розбору ResultDoc.validateOnParse: \u003d true; // розбір XMLDoc по XSL-шаблоном XMLDoc.transformNodeToObject (XSLDoc, ResultDoc); // змінної Str присвоюється текстове значення // результуючого документа. Str: \u003d ResultDoc.text; // пошук елемента FNode: \u003d r.SelectSingleNode ( "// InvoiceNumber"); // і отримання значення елемента parm: \u003d FNode.text; // закриває запит для доступу Query.Close; Query.Text: \u003d Str; // присвоювання значення параметра Query.Params.AsString: \u003d parm; // виконання запиту Query.ExecSQL; end;

Вся родзинка розбору полягає в застосуванні XSL-шаблону, який сформований для кожного типу документа індивідуально. Результатом розбору є рядок SQL-запиту. В наслідок виконання сформованої рядки SQL-запиту здійснить необхідні зміни даних у СУБД.

Перевага використання розбору через шаблон ще і в тому, що виходить якась гнучкість даних, і виходить повна незалежність роботи алгоритму від програмного коду. Нижче наведено використовуваний для обробки документа типу ORDER текст XSL-шаблону:

INSERT into TABREG (FROM, TO, TYPEDOC, body) VALUES ( " ", "", "") INSERT into GOODS (invoiceNumber, name, price, quality) VALUES ( ": num", " ", "", " ")

Пояснюючи вищенаведений приклад, треба відзначити, що використання пари тегів і носить формальний характер, тому що після розбору в результуючому XML-документі формально повинен бути присутнім хоча б один вузол. Метод ResultDoc.text привласнює текстове значення отриманого в ході розбору XML-документа ResultDoc. В цьому випадку значенням є все те, що обрамлено пари тегів і, тобто сформований нами SQL-запит.

Іншою особливістю написання програми треба відзначити можливість використання SQL-параметра : Num. Використання параметра дозволяє спростити текст xsl-шаблону. Визначення значення відповідних елементів вузлів XML-документа визначається спочатку вибору на ім'я відповідного вузла, наприклад:

Коротко про XSL

Абревіатура XSL походить від eXtensible Stylesheet Language - мова форматування таблиць стилів (XML даних). Як зрозуміло з заголовка eXtensible Stylesheet Language (XSL) використовується для форматування XML даних. За визначенням W3C XSL складається з двох частин:

  • XSLT - XSL Transformation. Мова, що використовується для перетворення або форматування (трансформування) XML документів. Таким чином, за допомогою XSLT ми можемо отримати різні розрізи безлічі даних і форми подання даних.
  • Елементи форматування. До цих елементів відносяться всі елементи типографического оформлення даних, після їх обробки їх за допомогою XSL. Використовується тільки для формування HTML сторінок.

За допомогою XSLT ми можемо відібрати потрібні нам дані з XML файлу, і оформити їх у вигляді для надання користувачеві. Наприклад, в нашому випадку ми перетворили XML дані у вигляді SQL запиту. Класичне застосування XSL - це, як правило форматування даних у вигляді HTML сторінок або більш рідкісне подання до вигляді RTF файлів.

XSL файл описує шаблон (template), згідно з яким буде відбуватися перетворення XML даних. Повертаючись до xsl-шаблонами, в XSLT можна виділити наступні елементи (директиви):

XSL-директиви опис
xsl: apply-templates Директива, яка вказує на застосування відповідних шаблонів атрибуту select \u003d "ім'я шаблону"
xsl: attribute створює дерево атрибутів і додає його в вихідний елемент, параметр name \u003d "ім'я атрибута", namespace - URI на простір імен (префікс простору імен)
xsl: call-template викликає шаблон, атрибуту name \u003d "URI на шаблон"
xsl: choose
xsl: when
xsl: otherwise
здійснення вибору за умовою xsl: when expr \u003d "обчислення виразу на script",
language \u003d "language-name"
test \u003d "обчислюється вираз"
xsl: comment генерує коментар в вихідний документ
xsl: copy
xsl: copy-of
копіює поточної вузол у вихідний джерело або вставляє фрагмент документа в вузол, де атрибут select \u003d "ім'я вузла джерела"
xsl: element створює вихідний елемент на ім'я, атрибут name \u003d "ім'я елемента", namespace \u003d "uri посилання на простір імен"
xsl: for-each повторно застосовує шаблон до всіх вузлів списку вузлів, атрибут select задає список вузлів
xsl: if перевірка умови, задається атрибутом test у вигляді виразу
xsl: include включає зовнішній шаблон, атрибут href \u003d "URI reference"
xsl: output специфицирует вихідний результат, атрибут method може мати значення "xml", "html" або "text"
xsl: param специфицирует значення параметрів, атрибут name \u003d "ім'я параметра", select \u003d "значення"
xsl: processing-instruction створює інструкцію обробки, атрибут name \u003d "ім'я процес інструкції"
xsl: sort сортує безліч вузлів, атрибути select \u003d "ім'я вузла", data-type \u003d тип даних ( "text" | "number" | Qname), order \u003d напрямок сортування ( "ascending" | "descending")
xsl: stylesheet визначає документ xsl-шаблонів, є кореневим елементом для XSLT
xsl: template визначає xsl-шаблон, атрибут name \u003d "URI префікс на ім'я шаблону", match \u003d "вказівку на вузол, до якого застосовується шаблон"
xsl: text генерує текст у вихідний потік, атрибут disable-output-escaping \u003d "yes" або "no", вказує на можливість генерації символів ESC
xsl: value-of вставляє значення обраного вузла як текст, атрибут select \u003d "покажчик на вузол" з якого беруть значення
xsl: variable специфицирует значення кордонів змінних, атрибут name \u003d "ім'я змінної", select \u003d "обчислення значення змінної"
xsl: with-param застосовує параметр до шаблону, атрибут name \u003d "ім'я параметра", select \u003d вираз для обчислення поточного контексту, значення за замовчуванням "."

висновок

На закінчення, необхідно відзначити, що використання стандартного XML-парсера msxml.dllє не єдиним засобом розбору і створення XML-документів. Наприклад, для створення XML документів ефективно використовувати компоненти TPageProduserі TТableProduser. Але, дана стаття лише підкреслює широту і можливість застосування на практиці DOM моделі.

Автор буде дуже вдячний за відгуки про актуальність теми, загальний зміст, стилі викладу, а також всім іншим коментарів, які допоможуть надалі поліпшити якість написання збірника статей і випуску книги, яка висвітлює тему практичного боку використання XML-документів в електронній комерції. Більш детальну інформацію про практичну сторону застосування електронних документів можна почерпнути на авторському сайті www.eDocs.al.ru Також на авторському сайті планується розмістити вихідні тексти і приклади.

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

У цій статті ми розглянемо XML Document Object Model (DOM) і її реалізацію фірмою Microsoft - Microsoft XML DOM.

XML DOM - це об'єктна модель, що надає в розпорядження розробника об'єкти для завантаження і обробки XML-файлів. Об'єктна модель складається з наступних основних об'єктів: XMLDOMDocument, XMLDOMNodeList, XMLDOMNode, XMLDOMNamedNodeMap і XMLDOMParseError. Кожен з цих об'єктів (крім XMLDOMParseError) містить властивості та методи, що дозволяють отримувати інформацію про об'єкт, маніпулювати значеннями і структурою об'єкта, а також переміщатися по структурі XML-документа.

Розглянемо основні об'єкти XML DOM і наведемо кілька прикладів їх використання в Borland Delphi.

Використання XML DOM в Borland Delphi

Для того щоб використовувати Microsoft XML DOM в Delphi-додатках, необхідно підключити до проекту відповідну бібліотеку типів. Для цього ми виконуємо команду Project | Import Type Library і в діалогової панелі Import Type Library вибираємо бібліотеку Microsoft XML version 2.0 (Version 2.0), яка зазвичай знаходиться в файлі Windows \\ System \\ MSXML.DLL

Після натискання кнопки Create Unit буде створено інтерфейсний модуль MSXML_TLB, який дозволить нам скористатися об'єктами XML DOM: DOMDocument, XMLDocument, XMLHTTPRequest і рядом інших, реалізованих в бібліотеці MSXML.DLL. Посилання на модуль MSXML_TLB повинна бути вказана в списку Uses.

Пристрій XML DOM

Document Object Model представляє XML-документ у вигляді дерева, що складається з гілок. Програмні інтерфейси XML DOM дозволяють додаткам переміщатися по дереву документа і маніпулювати його гілками. Кожна гілка може мати специфічний тип (DOMNodeType), згідно з яким визначаються батьківська і дочірні гілки. У більшості XML-документів можна зустріти гілки типу element, attribute і text. Атрибути (attribute) представляють собою особливий вид гілки і не є дочірніми гілками. Для управління атрибутами використовуються спеціальні методи, що надаються об'єктами XML DOM.

Крім реалізації рекомендованих World Wide Web Consortium (W3C) інтерфейсів, Microsoft XML DOM містить методи, що підтримують XSL, XSL Patterns, Namespaces і типи даних. Наприклад, метод SelectNodes дозволяє використовувати синтаксис шаблонів XSL (XSL Pattern Syntax) для пошуку гілок за певним контексту, а метод TransformNode підтримує використання XSL для виконання трансформацій.

Тестовий XML-документ

Як приклад XML-документа візьмемо каталог музичних CD-ROM, який має наступну структуру:

Empire Burlesque Bob Dylan USA Columbia 10.90 1985 Hide your heart Bonnie Tylor UK CBS Records 9.90 1988 ... Unchain my heart Joe Cocker USA EMI 8.20 1987

Тепер ми готові приступити до розгляду об'єктної моделі XML DOM, знайомство з якою почнемо з об'єкта XMLDOMDocument.

XML-документ - об'єкт XMLDOMDocument

Робота з XML-документом починається з його завантаження. Для цього ми використовуємо метод Load, який має всього один параметр, який вказує URL завантажується документа. При завантаженні файлів з локального диска вказується тільки повне ім'я файлу (протокол file: /// в даному випадку можна опустити). Якщо XML-документ зберігається у вигляді рядка, для завантаження такого документа слід використовувати метод LoadXML.

Для управління способом завантаження документа (синхронний або асинхронний) використовується властивість Async. За замовчуванням ця властивість має значення True, вказує на те, що документ завантажується асинхронно і управління повертається додатком ще до повного завантаження документа. В іншому випадку документ завантажується синхронно, і тоді доводиться перевіряти значення властивості ReadyState, щоб дізнатися, завантажився документ чи ні. Також можна створити обробник події OnReadyStateChange, який отримає управління при зміні значення властивості ReadyState.

Нижче показано, як завантажити XML-документ, використовуючи метод Load:

Uses ... MSXML_TLB ... procedure TForm1.Button1Click (Sender: TObject); var XMLDoc: IXMLDOMDocument; begin XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ( 'C: \\ DATA \\ DATA.xml'); // // Тут розташовується код, який маніпулює // XML-документом і його гілками // XMLDoc: \u003d Nil; end;

Після того як документ завантажений, ми можемо звернутися до його властивостей. Так, властивість NodeName буде містити значення #document, властивість NodeTypeString - значення document, властивість URL - значення file: /// C: /DATA/DATA.xml.

Обробка ошібoк

Особливий інтерес представляють властивості, пов'язані з обробкою документа при його завантаженні. Так, властивість ParseError повертає об'єкт XMLDOMParseError, що містить інформацію про помилку, що виникла в процесі обробки документа.

Щоб написати обробник помилки, можна додати наступний код:

Var XMLError: IXMLDOMParseError; ... XMLDoc.Load ( 'C: \\ DATA \\ DATA.xml'); XMLError: \u003d XMLDoc.ParseError; If XMLError.ErrorCode<> 0 Then // // Тут ми обробляємо помилку // Else Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: \u003d Nil;

Щоб дізнатися, яка інформація повертається в разі помилки, змінимо наступний елемент каталогу:

Empire Burlesque Bob Dylan USA Columbia 10.90 1985

прибравши закриває елемент у другому рядку:</p><p> <CD> <TITLE>Empire Burlesque <ARTIST>Bob Dylan</ARTIST> <COUNTRY>USA</COUNTRY> <COMPANY>Columbia</COMPANY> <PRICE>10.90</PRICE> <YEAR>1985</YEAR> </CD> </p><p>Тепер напишемо код, який повертає значення властивостей об'єкта XMLDOMParseError:</p><p>XMLError: \u003d XMLDoc.ParseError; If XMLError.ErrorCode<> 0 Then With XMLError, Memo1.Lines do begin Add ( 'Файл:' + URL); Add ( 'Код:' + IntToStr (ErrorCode)); Add ( 'Помилка:' + Reason); Add ( 'Текст:' + SrcText); Add ( 'Рядок:' + IntToStr (Line)); Add ( 'Позиція:' + IntToStr (LinePos)); end Else Memo1.Lines.Add (XMLDoc.XML); End;</p><p>і виконаємо наше додаток. В результаті отримуємо наступну інформацію про помилку.</p> <p>Як видно з наведеного прикладу, яку повертатимуть об'єктом XMLDOMParseError інформації цілком достатньо для того, щоб локалізувати помилку і зрозуміти причину її виникнення.</p> <p>Тепер відновимо закриває елемент <TITLE> в нашому документі і продовжимо обговорення XML DOM.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Доступ до дерева документа</h2> <p>Для доступу до дерева документа можна або отримати кореневий елемент і потім перебрати його дочірні гілки, або знайти якусь специфічну гілку. У першому випадку ми отримуємо кореневий елемент через властивість DocumentElement, яке повертає об'єкт типу XMLDOMNode. Нижче показано, як скористатися властивістю DocumentElement для того, щоб отримати вміст кожного дочірнього елемента:</p><p>Var Node: IXMLDOMNode; Root: IXMLDOMElement; I: Integer; ... Root: \u003d XMLDoc.DocumentElement; For I: \u003d 0 to Root.ChildNodes.Length-1 do Begin Node: \u003d Root.ChildNodes.Item [I]; Memo1.Lines.Add (Node.Text); End;</p><p>Для нашого XML-документа ми отримаємо наступний текст.</p> <p>Якщо нас цікавить якась специфічна галузь або гілка рівнем нижче першої дочірньої гілки, ми можемо скористатися або методом NodeFromID, або методом GetElementByTagName об'єкта XMLDOMDocument.</p> <p>Метод NodeFromID вимагає вказівки унікального ідентифікатора, визначеного в XML Schema або Document Type Definition (DTD), і повертає гілка з цим ідентифікатором.</p> <p>Метод GetElementByTagName вимагає вказівки рядка зі специфічним елементом (тегом) і повертає всі гілки з даним елементом. Нижче показано, як використовувати даний метод для знаходження всіх виконавців в нашому каталозі CD-ROM:</p><p>Nodes: IXMLDOMNodeList; Node: IXMLDOMNode; ... Nodes: \u003d XMLDoc.GetElementsByTagName ( 'ARTIST'); For I: \u003d 0 to Nodes.Length-1 do Begin Node: \u003d Nodes.Item [I]; Memo1.Lines.Add (Node.Text); End;</p><p>Для нашого XML-документа ми отримаємо наступний текст</p> <p>Відзначимо, що метод SelectNodes об'єкта XMLDOMNode забезпечує більш гнучкий спосіб для доступу до гілок документа. Але про це трохи нижче.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Гілка документа - об'єкт XMLDOMNode</h2> <p>Об'єкт XMLDOMNode є галузь документа. Ми вже стикалися з цим об'єктом, коли отримували кореневий елемент документа:</p><p>Root: \u003d XMLDoc.DocumentElement;</p><p>Для отримання інформації про гілки XML-документа можна використовувати властивості об'єкта XMLDOMNode (табл. 1).</p> <p>Для доступу до даних, що зберігаються в галузі, зазвичай використовують або властивість NodeValue (доступно для атрибутів, текстових гілок, коментарів, інструкцій по обробці та секцій CDATA), або властивість Text, яке повертає текстове вміст гілки, або властивість NodeTypedValue. Останнє, однак, може використовуватися тільки для гілок з тіпізованнимі елементами.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> Переміщення по дереву документа</h3> <p>Об'єкт XMLDOMNode надає безліч способів для переміщення по дереву документа. Наприклад, для доступу до батьківської гілки використовується властивість ParentNode (тип XMLDOMNode), доступ до дочірніх гілок здійснюється через властивості ChildNodes (тип XMLDOMNodeList), FirstChild і LastChild (тип XMLDOMNode) і т.д. Властивість OwnerDocument повертає об'єкт типу XMLDOMDocument, що ідентифікує сам XML-документ. Перераховані вище властивості дозволяють легко переміщатися по дереву документа.</p> <p>Тепер переберемо всі гілки XML-документа:</p><p>Root: \u003d XMLDoc.DocumentElement; For I: \u003d 0 to Root.ChildNodes.Length-1 do Begin Node: \u003d Root.ChildNodes.Item [I]; If Node.HasChildNodes Then GetChilds (Node, 0); End;</p><p>Як вже зазначалося вище, SelectNodes об'єкта XMLDOMNode забезпечує більш гнучкий спосіб доступу до гілок документа. Крім того, існує метод SelectSingleNode, який повертає тільки першу гілку документа. Обидва ці методи дозволяють задавати XSL-шаблони для пошуку гілок.</p> <p>Розглянемо процес використання методу SelectNodes для вилучення всіх гілок, у яких є гілка CD і гілка PRICE:</p><p>Root: \u003d XMLDoc.DocumentElement; Nodes: \u003d Root.SelectNodes ( 'CD / PRICE');</p><p>У колекцію Nodes будуть поміщені всі подветви PRICE гілки CD. До обговорення XSL-шаблонів повернемося трохи пізніше.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h3> Маніпуляція дочірніми гілками</h3> <p>Для маніпуляції дочірніми гілками ми можемо скористатися методами об'єкта XMLDOMNode (табл. 2).</p> <p>Для того щоб повністю видалити запис про першому диску, необхідно виконати наступний код:</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ( 'C: \\ DATA \\ DATA.xml'); // Отримати кореневої елемент Root: \u003d XMLDoc.DocumentElement; Node: \u003d Root; // Видалити першу дочірню гілку Node.RemoveChild (Node.FirstChild);</p><p>Зверніть увагу на те, що в даному прикладі ми видаляємо першу дочірню гілку. Як видалити перший елемент першої дочірньої гілки, показано нижче:</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.Load ( 'C: \\ DATA \\ DATA.xml'); // Отримати кореневої елемент Root: \u003d XMLDoc.DocumentElement; // і першу дочірню гілку Node: \u003d Root.FirstChild; // Видалити першу дочірню гілку Node.RemoveChild (Node.FirstChild);</p><p>У наведеному вище прикладі ми видалили не перший гілка <CD>…</CD>, А перший елемент гілки - <TITLE>….

Тепер додамо нову гілку. Нижче наведено код, що показує, як додати новий запис про музичному CD-ROM:

Var NewNode: IXMLDOMNode; Child: IXMLDOMNode; ... // Створимо нову гілку - NewNode: \u003d XMLDoc.CreateNode (1, 'CD', ''); // Додамо елемент Child: \u003d XMLDoc.CreateNode (1, 'TITLE', ''); // Додамо елемент NewNode.AppendChild (Child); // І встановимо його значення Child.Text: \u003d 'Pink Floyd'; // Додамо елемент <ARTIST> Child: \u003d XMLDoc.CreateNode (1, 'ARTIST', ''); // Додамо елемент NewNode.AppendChild (Child); // І встановимо його значення Child.Text: \u003d 'Division Bell'; // Додамо елемент <COUNTRY> Child: \u003d XMLDoc.CreateNode (1, 'COUNTRY', ''); // Додамо елемент NewNode.AppendChild (Child); // І встановимо його значення Child.Text: \u003d 'UK'; // Додамо елемент <COMPANY> Child: \u003d XMLDoc.CreateNode (1, 'COMPANY', ''); // Додамо елемент NewNode.AppendChild (Child); // І встановимо його значення Child.Text: \u003d 'EMI Records Ltd.'; // Додамо елемент <PRICE>Child: \u003d XMLDoc.CreateNode (1, 'PRICE', ''); // Додамо елемент NewNode.AppendChild (Child); // І встановимо його значення Child.Text: \u003d '11 .99 "; // Додамо елемент <YEAR> Child: \u003d XMLDoc.CreateNode (1, 'YEAR', ''); // Додамо елемент NewNode.AppendChild (Child); // І встановимо його значення Child.Text: \u003d '1994'; // І додамо гілка Root.AppendChild (NewNode); ...</p><p>Наведений вище код показує наступну послідовність дій по додаванню нової гілки:</p> <ul><li>Створення нової гілки методом CreateNode: <ul><li>створення елемента методом CreateNode;</li> <li>додавання елемента до гілки методом AppendChild;</li> <li>установка значення елемента через властивість Text;</li> <li>... повторити для всіх елементів.</li> </ul></li> <li>Додавання нової гілки до документа методом AppendChild.</li> </ul><p>Нагадаємо, що метод AppendChild додає гілка в кінець дерева. Для того щоб додати гілку в конкретне місце дерева, необхідно використовувати метод InsertBefore.</p> <h2> Набір гілок - об'єкт XMLDOMNodeList</h2> <p>Об'єкт XMLNodeList містить список гілок, який може бути побудований за допомогою методів SelectNodes або GetElementsByTagName, а також отримано з властивості ChildNodes.</p> <p>Ми вже розглядали використання цього об'єкта в прикладі, наведеному в розділі «Переміщення по дереву документа». Тут же ми наведемо деякі теоретичні зауваження.</p> <p>Число гілок в списку може бути отримано як значення властивості Length. Гілки мають індекси від 0 до Length-1, і кожна окрема гілка доступна через елемент масиву Item з відповідним індексом.</p> <p>Переміщення по списку гілок також може здійснюватися за допомогою методу NextNode, що повертає наступну гілку в списку, або Nil, якщо поточна гілка - остання. Щоб повернутися до початку списку, слід викликати метод Reset.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Створення і збереження документів</h2> <p>Отже, ми розглянули, як можна додавати гілки і елементи в існуючі XML-документи. Тепер створимо XML-документ «на льоту». Перш за все нагадаємо, що документ може бути завантажений не тільки з URL, але і зі звичайної рядка. Нижче показано, як створити кореневий елемент, який потім може використовуватися для динамічного побудови інших елементів (що ми вже розглянули в розділі «Маніпуляція дочірніми гілками»):</p><p>Var XMLDoc: IXMLDOMDocument; Root: IXMLDOMNode; Node: IXMLDOMNode; S: WideString; ... S: \u003d ' <CATALOG></CATALOG>'; XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Async: \u003d False; XMLDoc.LoadXML (S); Root: \u003d XMLDoc.DocumentElement; Node: \u003d XMLDoc.CreateNode (1, 'CD', ''); Root.AppendChild (Node); Memo1.Lines.Add (XMLDoc.XML); ... XMLDoc: \u003d Nil;</p><p>Після побудови XML-документа збережемо його у файлі за допомогою методу Save. наприклад:</p> <p>XMLDoc.Save ( 'C: \\ DATA \\ NEWCD.XML');</p> <p>Крім збереження в файлі метод Save дозволяє зберігати XML-документ в новому об'єкті XMLDOMDocument. В цьому випадку відбувається повна обробка документа і, як наслідок, перевірка його структури та синтаксису. Нижче показано, як зберегти документ в іншому об'єкті:</p><p>Procedure TForm1.Button2Click (Sender: TObject); var XMLDoc2: IXMLDOMDocument; begin XMLDoc2: \u003d CoDOMDocument.Create; XMLDoc.Save (XMLDoc2); Memo2.Lines.Add (XMLDoc2.XML); ... XMLDoc2: \u003d Nil; end;</p><p>На закінчення відзначимо, що метод Save також дозволяє зберігати XML-документ в інші COM-об'єкти, що підтримують інтерфейси IStream, IPersistStream або IPersistStreamInit.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> Використання XSL-шаблонів</h2> <p>Обговорюючи метод SelectNodes об'єкта XMLDOMNode, ми згадали про те, що він забезпечує більш гнучкий спосіб доступу до гілок документа. Гнучкість полягає в тому, що в якості критерію для вибору гілок можна вказати XSL-шаблон. Такі шаблони надають потужний механізм для пошуку інформації в XML-документах. Наприклад, для того, щоб отримати список всіх назв музичних CD-ROM в нашому каталозі, можна виконати наступний запит:</p><p>Щоб дізнатися, диски яких виконавців випущені в США, запит формується таким чином:</p><p>Nodes: \u003d Root.SelectNodes ( 'CD / ARTIST');</p><p>Нижче показано, як знайти перший диск в каталозі:</p><p>Nodes: \u003d Root.SelectNodes ( 'CD / TITLE');</p><p>і останній:</p><p>Nodes: \u003d Root.SelectNodes ( 'CD / TITLE');</p><p>Щоб знайти диски Боба Ділана, можна виконати наступний запит:</p><p>Nodes: \u003d Root.SelectNodes ( 'CD [$ any $ ARTIST \u003d "Bob Dylan"] / TITLE');</p><p>а щоб отримати список дисків, випущених після 1985 року, ми виконуємо наступний запит:</p><p>Nodes: \u003d Root.SelectNodes ( 'CD / TITLE');</p><p>Більш детальне обговорення синтаксису XSL вимагає окремої публікації. Щоб зацікавити читачів і підштовхнути до подальших досліджень, наведу лише один невеличкий приклад можливого використання XSL. Припустимо, нам необхідно перетворити наш каталог в звичайну HTML-таблицю. Користуючись традиційними способами, ми повинні перебрати всі гілки дерева і для кожного отриманого елемента сформувати відповідні теги <TD>…</TD>.</p> <p>Використовуючи XSL, ми просто створюємо шаблон (або таблицю стилів), в якому вказуємо, що і як треба перетворити. Потім накладаємо цей шаблон на наш каталог - і готово: перед нами текст XSL-шаблону, що перетворює каталог в таблицю (лістинг 2).</p> <p>Код для накладення XSL-шаблону на наш каталог виглядає так:</p><p>Procedure TForm1.Button2Click (Sender: TObject); var XSLDoc: IXMLDOMDocument; begin XSLDoc: \u003d CoDOMDocument.Create; XSLDoc.Load ( 'C: \\ DATA \\ DATA.xsl'); Memo2.Text: \u003d XMLDoc.TransformNode (XSLDoc); XSLDoc: \u003d Nil; end;</p><p>Завершуючи наше обговорення XSL, слід сказати, що в даний час ця мова активно використовується для трансформації між різними XML-документами, а також для форматування документів.</p> <table border="0" width="100%"><tr><td width="50%"> </td> <td width="50%"> </td> </tr></table><h2> висновок</h2> <p>З цілком зрозумілих причин в одній статті неможливо розглянути всі об'єкти Microsoft XML DOM і навести приклади їх використання. Тут ми лише торкнулися основних питань використання XML DOM в додатках. У табл. 3 показані всі об'єкти, реалізовані в Microsoft XML DOM.</p> <p>КомпьютерПресс 12 «2000</p> <p>ЗАМОВИТИ РІШЕННЯ ЗАДАЧ НА DELPHI <br> Delphi - це другий за значимістю мову програмування, з яким найчастіше студенти знайомляться в процесі навчання. Це початок вивчення об'єктно-орієнтованого програмування. Я як студент, зробив для себе висновок, що немає простіше методу освоїти мову, ніж написати на ньому калькулятор. Навіть якщо ви реалізуєте елементарну функцію додавання двох чисел, це вже на багато проллє світло.</p> <p>CodeGaear, Delphi 7, Lazarus - це різні компілятори, програми, які передадуть написаний вами код машині, перетворивши його в нулики і одинички. Це все програми для створення програм, а не окремі мови програмування. Дані компілятори використовують мову програмування Object Pascal, що лежить в основі мови Delphi, який по синтаксису схожий на звичайний Pascal, але функціонально істотно відрізняється. <br></p> <h2>Що таке синтаксис мови програмування?</h2> <p>Це формат написання різних операторів. Наприклад, цикл «for» на Паскалі має наступний формат: «for n: \u003d 1 to k do» і т.д.</p><p>У мові програмування C ++ цей же цикл пишеться трохи інакше: for (n \u003d 1; n Пишемо калькулятор</p><p>Це дасть вам зрозуміти, як взаємодіють об'єкти з програмним кодом, що таке «змінні», як працюють математичні функції. Будь-яке програмування в будь-якому випадку буде обчисленням. Гра - це теж програма, яка постійно щось вважає, працює з цифрами і числовими функціями. Програмування невіддільне від математики.</p> <p>Скористаємося для написання середовищем розробки Lazarus. Її функціонал не так багатий, як, скажімо, у CodeGear, але вона знаходиться в безкоштовному доступі і призначена для навчання.</p><p>Відкриваючи середу розробки, ми бачимо форму і панель елементів. Ось форма.</p> <p><img src='https://i1.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-24.jpg' width="100%" loading=lazy loading=lazy></p><p>Ось панель елементів.</p><p>Перше, що ми зробимо - це додамо три необхідних нам елемента для реалізації функції складання двох чисел. Потрібні: «Tedit» в кількості трьох штук і «TButton». На зображенні нижче вони показані на панелі стрілками. Клацаємо по ним один раз, а потім один раз за формою, і вони з'являються на ній.</p><p>Це текстові поля для введення і звичайна кнопка. З даними елементами ви стикаєтеся, використовуючи практично будь-яку програму Windows. Погляньте.</p><p><img src='https://i0.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-27.jpg' width="100%" loading=lazy loading=lazy><br></p> <p>Тепер очистимо ці написи. Натисніть вкладку «Вид». І клацніть по пункту «Інспектор об'єктів. З'явиться ось таке вікно.</p><p><img src='https://i1.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-28.jpg' width="100%" loading=lazy loading=lazy></p><p>Клацаємо один раз на нашу елементу «Кнопка» на форму і міняємо значення «Caption» у вікні інспектора на будь-яке інше. Наприклад, на слово «Ок». Тиснемо Enter. Бачимо на формі, як елемент поміняв назву.</p><p>Так само зробимо і з Edit'амі, тільки не перейменуємо, а зробимо їх без всякого змісту. Виділяємо їх по черзі і очищаємо значення Text в інспектора. Не забуваємо тиснути Enter.</p><p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-29.jpg' width="100%" loading=lazy loading=lazy></p><p>За підсумком наша форма виглядає ось так.</p><p><img src='https://i0.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-30.jpg' width="100%" loading=lazy loading=lazy><br></p> <p>Тепер, щоб наш калькулятор заробив, потрібно прописати необхідний програмний код для процедури нашої кнопки. Тиснемо по елементу Button двічі і відкриваємо редактор вихідного коду.</p><p><img src='https://i2.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-31.jpg' width="100%" loading=lazy loading=lazy></p><p>Бачите? Процедура Button1Click. Це процедура, яка відповідає за те, що станеться, коли ми натиснемо на кнопку один раз. А статися має наступне: програмі потрібно в третьому Edit вивести нам суму чисел, введених в перших двох полях. Пишемо код.</p><p><img src='https://i0.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-32.jpg' width="100%" loading=lazy loading=lazy></p><p>Такі нескладні 5 рядків коду нам потрібно написати. Коментарі та пояснення видно на зображенні вище. Після цього, натискаємо ось цю кнопку.</p> <p>Буде виконана компіляція нашого проекту. Він буде зібраний в програму. Вводимо числа в перші два поля, тиснемо на кнопку і отримуємо значення суми.</p><p><img src='https://i1.wp.com/reshatel.org/wp-content/uploads/2018/09/Bez-imeni-34-2.jpg' width="100%" loading=lazy loading=lazy></p> <h2>висновок</h2> <p>Можете натиснути кнопку «Файл», потім «Зберегти все», вибрати папку для збереження і у вас буде повноцінна програма, запуск якої можна здійснити з робочого столу. Тепер спробуйте розібратися самостійно, що потрібно переписати в цьому коді, щоб програма ділила два числа, а не складала. Підказка: потрібно змінити тип даних. На відео нижче розглянуто схожий приклад, але в середовищі Delphi 7, а не Lazarus.</p><p><span class="6qR5tjJKK3g"></span></p> <p>У багатьох програмістів Delphi, збереження налаштувань асоціюється з використанням <i>INI</i> файлів в своїх програмах. Застосування даного методу, в більш менш серйозних проектах, необхідно уникати, так як це обмежує в гнучкості, що перешкоджає подальшому розширенню програми. Варто сказати, що такий підхід досить популярний, в силу своєї простоти використання і наявності вбудованих засобів в середу розробки. <br><br> Проте, ідеальним варіантом для зберігання налаштувань програми є структуровані <i>XML</i> файли. Їх перевага полягає в тому, що кількість параметрів може бути не фіксованим. Щоб краще це зрозуміти, розглянемо конкретний приклад.</p><p>У програмі USearch, при кліці по запису, з'являється контекстне меню, в якому відображається список пунктів. Ці пункти є командами, які в свою чергу завантажуються з файлу налаштувань. У разі, якби настройки зберігалися в <i>INI</i> файлі, то програма могла б зберігати і завантажувати певну кількість команд, наприклад 10 або 50. Як тільки буде потрібно більше значення, доведеться заново переписувати код і відповідно повторно компілювати його.</p><p><img src='https://i1.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.ini_.jpg' height="145" width="247" loading=lazy loading=lazy><br> Застосовуючи підхід з використанням <i>XML</i> файлів, у нас з'явиться можливість завантажувати всі параметри секції динамічно. До всього цього, файл конфігурації стане більш витонченим, без надмірної нумерації параметрів. Однак, стандартні засоби для роботи з <i>XML</i> в Delphi мають безліч недоліків, тому рекомендую використовувати стандартну бібліотеку <b>MSXML</b>. Зазвичай вона за замовчуванням входить до складу операційних систем сімейства Windows.</p><p><img src='https://i1.wp.com/zoo-mania.ru/wp-content/uploads/2011/08/settings.xml_.jpg' align="center" width="100%" loading=lazy loading=lazy><br> Для підключення <b>MSXML</b>, Нам необхідно сформувати файл інтерфейсу зі списком всіх функцій, імпортувавши його з COM-сервера. Як імпортувати інтерфейс написано не мало докладних статей, я ж пропоную вам завантажити файл <b>MSXML2_TLB.PAS</b> вже готовий до використання. Після того, як файл буде викачаний, розмістіть його поруч з вашим проектом, або закиньте в папку lib середовища Delphi. Таким чином, всі створювані програми зможуть використовувати модуль <b>MSXML</b>, Досить лише дописати в uses рядок MSXML2_TLB.</p><p>Для наочності, розглянемо наступний приклад застосування цієї бібліотеки:</p><p>Procedure LoadData; var XMLDoc: DOMDocument; Root: IXMLDOMElement; begin XMLDoc: \u003d CoDOMDocument.Create; XMLDoc.Load ( "settins.xml"); Root: \u003d XMLDoc.DocumentElement; ShowMessage (Root.SelectSingleNode ( "size / width"). Text); Root: \u003d nil; XMLDoc: \u003d nil; end;</p><p>Спочатку створюється екземпляр класу DOMDocument, після чого в пам'ять завантажується вміст файлу settings.xml. Так як за стандартом будь <i>XML</i> файл повинен містити кореневої тег (в даному випадку <i>config</i>), То нам необхідно його отримати, використовуючи функцію <i>DocumentElement</i>. Потім відбувається виведення вмісту між тегами <width></width> , Які в свою чергу знаходяться між тегами <size></size> . Таким чином з файлу settings.xml, наш метод виведе в MessageBox текст <i>"100px"</i>.</p><p> <?xml version="1.0" encoding="utf-8"?> <config> <size> <height>500px</height> <width>100px</width> </size> </config> </p><p>Тут застосований метод SelectSingleNode, який в якості параметра приймає рядок</p> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> </article> <div class="post-bottom"> <div class="post-share"> <script src="//yastatic.net/es5-shims/0.0.2/es5-shims.min.js"></script> <script src="//yastatic.net/share2/share.js"></script> <div class="ya-share2" data-services="vkontakte,facebook,odnoklassniki,moimir" data-counter=""></div> </div> </div> <div class='yarpp-related'> <div class="related-items"> <div class="headline">Чи не знайшли відповідь на своє питання? Подивіться тут</div> <div class="items"> <div class="related-item"> <a class="related-item__title" href="https://totrdlo.ru/uk/1s-rasshirenie-raboty-failami-chrome-rasshirenie-dlya-raboty-s-failami-v.html"><img src="/uploads/b9a1cd0ff90fe53a44f4b868cd1ab03a.jpg" width="120" height="120" alt="Розширення для роботи з файлами в веб-клієнті" class="related-item__image" / loading=lazy loading=lazy>Розширення для роботи з файлами в веб-клієнті</a> <div class="related-item__comments"><span></span></div> </div> <div class="related-item"> <a class="related-item__title" href="https://totrdlo.ru/uk/kody-oshibok-elektronnoi-pochty-ispravlenie-oshibki-server.html"><img src="/uploads/c28f0dcb89eb151e87752da66b2f742f.jpg" width="120" height="120" alt="Виправлення помилки"Сервер отказал в доступе по протоколу POP3" при подключении почты Gmail!" class="related-item__image" / loading=lazy loading=lazy>Виправлення помилки "Сервер відмовив у доступі за протоколом POP3" при підключенні пошти Gmail!</a> <div class="related-item__comments"><span></span></div> </div> <div class="related-item"> <a class="related-item__title" href="https://totrdlo.ru/uk/1s-8-1-ne-zapuskaetsya-na-windows-10-ispravlyaem-oshibku-poryadok.html"><img src="/uploads/ac8a980357b9757325284a326b9fd268.jpg" width="120" height="120" alt="1 цієї статті не запускається на windows 10" class="related-item__image" / loading=lazy loading=lazy>1 цієї статті не запускається на windows 10</a> <div class="related-item__comments"><span></span></div> </div> </div> </div> </div> <div style="text-align: center; margin-top: 15px; margin-bottom: 15px; " id="vanna-1965575812"><div class="adsense"><script type="text/javascript">ga_1();</script></div></div> </main> <aside class="sidebar"> <div class="advices" data-theme="vannapedia_v.3"> <div class="headline"></div> <div class="advices-content"> <img src="/uploads/95c0d840f7878d6b89f8e322632280e2.jpg" width="120" height="120" alt="Додавання зовнішньої друкованої форми в базу Зовнішні друковані форми зуп 3" class="advices__image" / loading=lazy loading=lazy> <div class="advices__title" data-id="3334"><a href="https://totrdlo.ru/uk/dobavlenie-vneshnei-pechatnoi-formy-v-bazu-dobavlenie-vneshnei.html">Додавання зовнішньої друкованої форми в базу Зовнішні друковані форми зуп 3</a></div> </div> </div> <div class="vk-widget" id="text-3"> <div class="textwidget"><script type="text/javascript" src="//vk.com/js/api/openapi.js?130"></script> <div id="vk_groups"></div> </div> </div> <div class="sidebar-questions"> <div class="headline">нове</div> <ul> <li><a href="https://totrdlo.ru/uk/zapret-provedeniya-dokumentov-v-1s-8-3-buhuchet-info-avtomaticheskaya.html" >Заборона проведення документів в 1с 8</a></li> <li><a href="https://totrdlo.ru/uk/dlya-chego-nuzhno-razgranichenie-po-polzovatelyam.html" >Для чого потрібно розмежування по користувачах</a></li> <li><a href="https://totrdlo.ru/uk/otbor-v-tablice-znachenii-1s-8-2-kakie-metody-sushchestvuyut-i-kak-iskat-odnovremenno-po-neskolkim-zna.html" >Відбір в таблиці значень 1с 8</a></li> <li><a href="https://totrdlo.ru/uk/obnovlenie-buhgalterii-2-0-na-3-0-uchet-materialno-proizvodstvennyh-zapasov.html" >Оновлення бухгалтерії 2</a></li> <li><a href="https://totrdlo.ru/uk/login-parol-dlya-obnovleniya-1s-roznica.html" >Логін пароль для поновлення 1с роздріб</a></li> <li><a href="https://totrdlo.ru/uk/com-ustanovlen-bezopasnyi-rezhim-vypolnenie-operacii-zapreshcheno.html" >Програмне відкриття зовнішньої обробки</a></li> </ul> </div> <div class="section"> </div> <div class="section"> <div class="headline">Популярні статті</div> <ul class="sidebar-posts"> <li><a href="https://totrdlo.ru/uk/podklyuchennyh-fiskalnyh-ustroistv-ne-naideno-ustanovka-i.html"><img src="/uploads/5df9163e05fa9245cdb80b7f64ec6186.jpg" width="80" height="80" alt="Установка і настройка фіскального реєстратора" / loading=lazy loading=lazy>Установка і настройка фіскального реєстратора</a></li> <li><a href="https://totrdlo.ru/uk/kak-izmenit-nazvanie-organizacii-v-1s-8-3-izmenenie-sluzhebnyh-rekvizitov.html"><img src="/uploads/eb6c692f9abb4922889b5f4223818c4a.jpg" width="80" height="80" alt="Як змінити назву організації в 1с 8" / loading=lazy loading=lazy>Як змінити назву організації в 1с 8</a></li> <li><a href="https://totrdlo.ru/uk/1s-8-3-kak-sdelat-pole-nedostupnym.html"><img src="/uploads/2ab15198b6dd38b0d618cbde07d80615.jpg" width="80" height="80" alt="3 як зробити поле недоступним" / loading=lazy loading=lazy>3 як зробити поле недоступним</a></li> </ul> </div> <div class="section"> <div class="headline">Нове на сайті</div> <ul class="sidebar-posts sidebar-photo"> <li><a href="https://totrdlo.ru/uk/biblioteka-standartnyh-podsistem-vnedrenie-biblioteki-standartnyh.html">Впровадження бібліотеки стандартних підсистем Оновлення БСП 1с</a></li> <li><a href="https://totrdlo.ru/uk/posle-obnovleniya-konfiguracii-1s-8-3-trebuet-licenziyu-ne-naidena-licenziya.html">Після оновлення конфігурації 1с 8</a></li> <li><a href="https://totrdlo.ru/uk/instrumenty-razrabotchika-obnovlenie-vspomogatelnyh-dannyh.html">Створення нового документа з друкованими формами</a></li> <li><a href="https://totrdlo.ru/uk/1s-obnovlenie-vspomogatelnyh-dannyh-obnovlenie-spravochnika-identifikatory.html">Оновлення довідника ідентифікатори об'єктів метадані не монопольно</a></li> <li><a href="https://totrdlo.ru/uk/periodicheskie-registry-svedenii-v-1s-8-3-poisk-i-chtenie-v-registre.html">Періодичні регістри відомостей в 1с 8</a></li> </ul> </div> </aside> </div> <footer class="footer"> <nav class="footer__nav"><ul><li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-1219"><a href="https://totrdlo.ru/uk/">нове</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/tormoza-na-failovoi-baze---kak-izbezhat-iz-nedavnego-opyta-tormoza-na.html">Гальма на файлової базі - як уникнути (з недавнього досвіду) Неможливо заблокувати таблицю config 1с</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/kak-otklyuchit-obnovlenie-1s-8-3.html">Як відключити оновлення 1с 8</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/skachat-shablon-1s-8-3-buhgalteriya-shablony-konfiguracii-i.html">Завантажити шаблон 1с 8.3 бухгалтерія. Шаблони конфігурацій і оновлень. Завантаження файлів установки конфігурації</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/vybor-nastroek-dinamicheskogo-spiska-1s-8-3-sposoby-polucheniya-i.html">Вибір налаштувань динамічного списку 1с 8</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-1230"><a href="https://totrdlo.ru/uk/">Популярне</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/vypolnenie-obrabotchikov-obnovleniya-ne-zakanchivaetsya-procedury.html">Процедури обробки даних</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/perenos-1s-bazovaya-na-drugoi-kompyuter-dobavlenie-bazy.html">Перенесення 1с базова на інший комп'ютер</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/pereustanovit-1s-na-drugoi-kompyuter-ustanovka-licenzii-na.html">Установка ліцензії на новому комп'ютері</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/portal-predostavleniya-gosudarstvennyh-uslug-gosuslugi-lichnyi-kabinet.html">Держпослуги особистий кабінет</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/gosportal-gosudarstvennyh-uslug-gosuslugi--lichnyi-kabinet--vhod.html">Госуслугі- особистий кабінет-вхід по СНІЛС і телефону</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/edinyi-telefon-sluzhby-spaseniya-v-rossiiskoi-federacii-ekstrennye-telefony.html">Єдиний телефон служби порятунку в російській федерації</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/departament-informacionnyh-tehnologii-svyazi-i-zashchity-informacii.html">Департамент інформаційних технологій, зв'язку та захисту інформації Міністерство інформатизації</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/okazanie-pervoi-pomoshchi-pri-elektricheskom-toke-deistviya-i.html">Дії та надання першої медичної допомоги при ураженні електричним струмом</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-1236"><a href="https://totrdlo.ru/uk/">Рекомендуємо</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/ekstrennyi-vyzov-s-sotovogo-telefona-telefonnye-mobilnye-nomera.html">Телефонні мобільні номери екстрених служб</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/upravlenie-departamenta-po-cao-go-i-chs-ministerstvo-rossiiskoi-federacii-po.html">Міністерство Російської Федерації у справах цивільної оборони, надзвичайних ситуацій і ліквідації наслідків стихійних лих (МНС Росії)</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/so-optimizaciya-servernoi-infrastruktury-so-optimizaciya-servernoi.html">SO Оптимізація серверної інфраструктури Технічні рішення оптимізації для серверів</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/tehnologiya-provedeniya-migracii-dannyh-v-krupnyh-proektah-migraciya.html">Міграція баз даних Методика міграції даних</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/zafiksirovany-izmeneniya-v-konfiguracii-sistemy-izmeneniya.html">Зафіксовані зміни в конфігурації системи</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/pometka-na-udalenie-1s-8-3-buhuchet-info-avtomaticheskoe-udalenie-obektov-po.html">Позначка на видалення 1с 8</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/kak-rabotat-v-programme-gis-gmp-instrukciya-po-podklyucheniyu-uchastnikov-i-po.html">Інструкція по підключенню учасників і з перевірки взаємодії з гис ГМП листів Чи можна не підключатися до гис ГМП</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-"><a href="https://totrdlo.ru/uk/1s-8-udalenie-pomechennyh-obektov-buhuchet-info-pochemu-ne.html">1с 8 видалення позначених об'єктів</a></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-6898"><a href="https://totrdlo.ru/uk/">Про сайт</a> <ul class="sub-menu"> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-6900"><a href="">Про сайт</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-6901"><a href="">Реклама на сайті</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-6902"><a href="">Контакти</a></li> </ul> </li> </ul></nav> <div class="footer-bottom"> <div class="footer-left"> <div class="foot__logo"> <div class="footer__logo-sitename">totrdlo.ru <span> ru</span></div> </div> <style> .foot__logo { min-height: 35px; margin: 0 0 11px -79px; padding: 9px 0 0 79px; text-decoration: none; } </style> <p>© +2021 Всі права захищені</p> <p>Ваш гід по мобільному зв'язку. Оператори. Корисні поради</p> <ul class="footer-bottom__nav"> <li><a href="" >Реклама на проекті</a></li> </ul> </div> <div class="footer-buttons"> </div> <ul class="footer__soc"> <li><a href="http://vk.com/" target="_blank" class="vk">ВКонтакте</a></li> <li>Однокласники</li> <li><a href="http://www.facebook.com/" target="_blank" class="fb">Facebook</a></li> <li><a href="https://twitter.com/" target="_blank" class="twi">Twitter</a></li> </ul> <div class="footer-right"> <div class="footer__note"></div> <div class="footer__counters" id="text-2"> <div class="textwidget"></div> </div> </div> </div> </footer> </div> </div> <link rel='stylesheet' id='wp-lightbox-bank.css-css' href='/wp-content/plugins/wp-lightbox-bank/assets/css/wp-lightbox-bank.css?ver=4.8.3' type='text/css' media='all' /> <script type='text/javascript' src='https://totrdlo.ru/wp-content/themes/vannapedia_v.3/js/scripts.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.8.3'></script> <script type='text/javascript' src='/assets/scripts1.js'></script> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1"} ; /* ]]> */ </script> <script type='text/javascript' src='https://totrdlo.ru/wp-content/plugins/table-of-contents-plus/front.min.js?ver=1509'></script> <script type='text/javascript'> var q2w3_sidebar_options = new Array(); q2w3_sidebar_options[0] = { "sidebar" : "sidebar-fixed", "margin_top" : 10, "margin_bottom" : 0, "stop_id" : "respond", "screen_max_width" : 0, "screen_max_height" : 0, "width_inherit" : false, "refresh_interval" : 1500, "window_load_hook" : false, "disable_mo_api" : false, "widgets" : ['text-4'] } ; </script> <script type='text/javascript' src='https://totrdlo.ru/wp-content/plugins/q2w3-fixed-widget/js/q2w3-fixed-widget.min.js?ver=5.0.4'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.8.3'></script> <script type='text/javascript' src='https://totrdlo.ru/wp-content/plugins/wp-lightbox-bank/assets/js/wp-lightbox-bank.js?ver=4.8.3'></script> <script type='text/javascript' src='https://totrdlo.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.0'></script> </body> </html>