Узел DOM - инструкция обработки.
Полное описание, параметры и ограничения
ИнструкцияОбработкиDOM (DOMProcessingInstruction)
ИнструкцияОбработкиDOM (DOMProcessingInstruction)
Доступен, начиная с версии 8.1.
Свойства:
URIПространстваИмен (NamespaceURI)
Атрибуты (Attributes)
БазовыйURI (BaseURI)
ДокументВладелец (OwnerDocument)
ДочерниеУзлы (ChildNodes)
ЗначениеУзла (NodeValue)
ИмяУзла (NodeName)
ЛокальноеИмя (LocalName)
ПервыйДочерний (FirstChild)
ПоследнийДочерний (LastChild)
ПредыдущийСоседний (PreviousSibling)
Префикс (Prefix)
РодительскийУзел (ParentNode)
СледующийСоседний (NextSibling)
ТекстовоеСодержимое (TextContent)
ТипУзла (NodeType)
Данные (Data)
Цель (Target)
Методы:
ВставитьПеред (InsertBefore)
ДобавитьДочерний (AppendChild)
ЕстьАтрибуты (HasAttributes)
ЕстьДочерниеУзлы (HasChildNodes)
ЗаменитьДочерний (ReplaceChild)
КлонироватьУзел (CloneNode)
НайтиURIПространстваИмен (LookupNamespaceURI)
НайтиПрефикс (LookupPrefix)
Нормализовать (Normalize)
ПолучитьПользовательскиеДанные (GetUserData)
ПространствоИменПоУмолчанию (IsDefaultNamespace)
СравнитьПозициюВДокументе (CompareDocumentPosition)
УдалитьДочерний (RemoveChild)
УзелИдентичен (IsSameNode)
УзелРавен (IsEqualNode)
УстановитьПользовательскиеДанные (SetUserData)
Описание:
Узел DOM - инструкция обработки.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
См. также:
ДокументDOM, метод СоздатьИнструкциюОбработки
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Добавить технический комментарий и инструкцию обработки XML
Комментарий объясняет учебный файл, а инструкция guide несёт технические данные. Ни один из этих узлов не является товаром.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Документ = Новый ДокументDOM("", "products");
Комментарий = Документ.СоздатьКомментарий("Учебные данные, не для рабочей загрузки");
Документ.ЭлементДокумента.ДобавитьДочерний(Комментарий);
Инструкция = Документ.СоздатьИнструкциюОбработки("guide", "version=1");
Документ.ВставитьПеред(Инструкция, Документ.ЭлементДокумента);
Сообщить(Комментарий.Данные);
Сообщить(Комментарий.Размер);
Сообщить(Комментарий.ТипУзла);
Сообщить(Комментарий.ИмяУзла);
Сообщить(Комментарий.ДокументВладелец = Документ);
Сообщить(Комментарий.РодительскийУзел = Документ.ЭлементДокумента);
Сообщить(Не Комментарий.ЕстьДочерниеУзлы());
Сообщить(Инструкция.Цель = "guide");
Сообщить(Инструкция.Данные = "version=1");
Сообщить(Инструкция.ИмяУзла);
Сообщить(Инструкция.ТипУзла);
Сообщить(Инструкция.РодительскийУзел = Документ);
Сообщить(Инструкция.СледующийСоседний = Документ.ЭлементДокумента);
Инструкция.Данные = "version=2";
Сообщить(Инструкция.Данные = "version=2");
Запись = Новый ЗаписьXML;
Запись.УстановитьСтроку();
Сериализатор = Новый ЗаписьDOM;
Сериализатор.Записать(Документ, Запись);
Сообщить(Запись.Закрыть());Разбор по шагам
Комментарий создаётся фабрикой документа и становится ребёнком корня products.
Инструкцию guide вставляем перед корнем как ребёнка ДокументDOM. Это не XML-объявление с зарезервированной целью xml.
Цель и Данные инструкции различаются; меняем только данные с version=1 на version=2.
В XML комментарии и инструкции имеют собственный синтаксис. Методы сериализатора оформляют его, а не ручная конкатенация скобок.
Как проверить результат
Родитель комментария — корень products, родитель инструкции — ДокументDOM.
Следующий сосед инструкции — корневой элемент, цель guide сохранилась, данные стали version=2.
Все логические контрольные сообщения Истина; сериализация содержит оба технических узла.
Ожидаемый результат
Разобраны две разновидности нетоварных узлов XML и их место в дереве.
На что обратить внимание
Комментарий не должен содержать --, а данные инструкции — ?>. Этот пример использует только фиксированные допустимые строки.
Не помещайте пароли и токены в комментарии: они тоже попадают в файл XML.
Получатель может игнорировать инструкцию guide; это не договорённость реального протокола.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Сравнить восемь видов узлов XML на одном созданном дереве
Получаем настоящие документ, элемент, атрибут, текст, комментарий, CDATA, инструкцию и фрагмент. Таблица объясняет, почему одни свойства имеют значение, а другие — Неопределено.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Выполняйте на сервере учебной базы; документ и все восемь узлов полностью создаются в памяти.
Фрагмент намеренно не вставляется в основной документ: это отдельный контейнер с элементом note.
Поставьте точку останова после цикла и откройте Диагностика в отладчике, чтобы сравнить все шестнадцать колонок.
Документ = Новый ДокументDOM("urn:guide:nodes", "g:guide");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", "urn:guide:nodes");
Атрибут = Документ.СоздатьАтрибут("code");
Атрибут.Значение = "A-01";
Корень.УстановитьУзелАтрибута(Атрибут);
Текст = Документ.СоздатьТекстовыйУзел("Книга");
Комментарий = Документ.СоздатьКомментарий("учебный комментарий");
CDATA = Документ.СоздатьСекциюCDATA("<данные>");
Инструкция = Документ.СоздатьИнструкциюОбработки("guide", "mode=test");
Корень.ДобавитьДочерний(Текст);
Корень.ДобавитьДочерний(Комментарий);
Корень.ДобавитьДочерний(CDATA);
Корень.ДобавитьДочерний(Инструкция);
Фрагмент = Документ.СоздатьФрагментДокумента();
Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("note"));
Узлы = Новый Массив;
Узлы.Добавить(Документ);
Узлы.Добавить(Корень);
Узлы.Добавить(Атрибут);
Узлы.Добавить(Текст);
Узлы.Добавить(Комментарий);
Узлы.Добавить(CDATA);
Узлы.Добавить(Инструкция);
Узлы.Добавить(Фрагмент);
Диагностика = Новый ТаблицаЗначений;
Для Каждого ИмяКолонки Из СтрРазделить("Тип,Имя,ЛокальноеИмя,URI,Префикс,Значение,Текст,БазовыйURI,ДокументВладелец,Родитель,Предыдущий,Следующий,Первый,Последний,Детей,Атрибутов", ",") Цикл
Диагностика.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
Для Каждого Узел Из Узлы Цикл
СтрокаДиагностики = Диагностика.Добавить();
СтрокаДиагностики.Тип = Узел.ТипУзла;
СтрокаДиагностики.Имя = Узел.ИмяУзла;
СтрокаДиагностики.ЛокальноеИмя = Узел.ЛокальноеИмя;
СтрокаДиагностики.URI = Узел.URIПространстваИмен;
СтрокаДиагностики.Префикс = Узел.Префикс;
СтрокаДиагностики.Значение = Узел.ЗначениеУзла;
СтрокаДиагностики.Текст = Узел.ТекстовоеСодержимое;
СтрокаДиагностики.БазовыйURI = Узел.БазовыйURI;
СтрокаДиагностики.ДокументВладелец = Узел.ДокументВладелец;
СтрокаДиагностики.Родитель = Узел.РодительскийУзел;
СтрокаДиагностики.Предыдущий = Узел.ПредыдущийСоседний;
СтрокаДиагностики.Следующий = Узел.СледующийСоседний;
СтрокаДиагностики.Первый = Узел.ПервыйДочерний;
СтрокаДиагностики.Последний = Узел.ПоследнийДочерний;
СтрокаДиагностики.Детей = Узел.ДочерниеУзлы.Количество();
Если Узел.Атрибуты = Неопределено Тогда
СтрокаДиагностики.Атрибутов = 0;
Иначе
СтрокаДиагностики.Атрибутов = Узел.Атрибуты.Количество();
КонецЕсли;
Сообщить(СтрШаблон("%1 / %2: детей %3, атрибутов %4", Узел.ТипУзла, Узел.ИмяУзла,
СтрокаДиагностики.Детей, СтрокаДиагностики.Атрибутов));
Сообщить(Узел.ЕстьДочерниеУзлы() = (СтрокаДиагностики.Детей > 0));
Сообщить(Узел.ЕстьАтрибуты() = (СтрокаДиагностики.Атрибутов > 0));
КонецЦикла;
Сообщить(Диагностика.Количество() = 8);
Сообщить(Документ.ДокументВладелец = Неопределено);
Сообщить(Атрибут.РодительскийУзел = Неопределено);
Сообщить(Атрибут.ЭлементВладелец.УзелИдентичен(Корень));
Сообщить(Текст.ЗначениеУзла = "Книга");
Сообщить(Корень.ЗначениеУзла = Неопределено);
Сообщить(Корень.ТекстовоеСодержимое = "Книга<данные>");
Сообщить(Комментарий.ТекстовоеСодержимое = "учебный комментарий");
Сообщить(Фрагмент.РодительскийУзел = Неопределено);Разбор по шагам
Свойства общего узла доступны у разных конкретных видов, но их значения отличаются: ИмяУзла #text — не имя товара.
ЗначениеУзла содержит значение текста и атрибута, но не текст элемента. ТекстовоеСодержимое элемента объединяет текст и CDATA, исключая комментарии и инструкции.
РодительскийУзел и ДокументВладелец — разные связи. У атрибута нет родителя дерева, но есть ЭлементВладелец; у документа нет документа-владельца.
Первый/ПоследнийДочерний и соседние узлы могут быть Неопределено. ДочерниеУзлы всё равно предоставляет список, в том числе пустой.
Атрибуты предоставляет коллекцию только у элемента. Проверяем Неопределено до вызова Количество.
URIПространстваИмен, ЛокальноеИмя и Префикс описывают квалифицированное имя; БазовыйURI относится к разрешению URI, а не к адресу товара.
Как проверить результат
Диагностика содержит восемь строк разных видов; проверки наличия детей и атрибутов совпадают с размерами коллекций.
У корня четыре дочерних узла, а ТекстовоеСодержимое равно Книга<данные>, без комментария и mode=test.
Атрибут A-01 не является дочерним узлом корня; его ЭлементВладелец совпадает с корнем.
Фрагмент имеет одного ребёнка note, но пока не имеет родителя в основном дереве.
Ожидаемый результат
Построена диагностическая таблица реальных узлов, которая разделяет имя, значение, текст, связи и пространства имён.
На что обратить внимание
ТекстовоеСодержимое — не сериализованный XML; для разметки используйте ЗаписьDOM.
Значение Неопределено не означает повреждение: для некоторых видов узлов это предусмотренное поведение.
Коллекция атрибутов не обязана сохранять порядок. XML-префикс — псевдоним URI, а не идентификатор бизнес-объекта.
Нельзя произвольно назначать родителя или владельца: эти связи управляются методами дерева.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.