Тип: Булево. Признак отображения узлов атрибутов DOM. Истина - отображаются.
Полное описание, параметры и ограничения
ФильтрУзловDOM.ОтображатьАтрибут (DOMNodeFilter.ShowAttribute)
ФильтрУзловDOM (DOMNodeFilter)
ОтображатьАтрибут (ShowAttribute)
Доступен, начиная с версии 8.1.
Использование:
Только чтение.
Описание:
Тип: Булево.
Признак отображения узлов атрибутов DOM.
Истина - отображаются.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Начать обход с атрибута или отдельного фрагмента
Отбор атрибутов не добавляет их к обходу дочерних тегов: для этого урок задаёт сам атрибут корнем отдельного итератора.
Где и как запускать
Полный серверный общий модуль собственной учебной базы; работа с собственными DOM в памяти.
Подготовка
Собственная учебная база 8.5.1.1343. Создайте серверный общий модуль УчебныйОбходXML с флагом Сервер. Вставьте полный модуль одного урока и вызовите УчебныйОбходXML.ВыполнитьПример() из серверной команды собственной обработки.
Деревья создаются из фиксированных учебных данных. Нет чтения файлов, запросов сети, записей базы или произвольного внешнего XML.
Свойства ФильтрУзловDOM доступны только для чтения. Набор видов узлов задаётся параметрами конструктора, а не присваиванием ОтображатьЭлемент=Истина.
Параметры конструктора — значения перечисления ПараметрыОтбораУзловDOM, не Булево. Пустые позиции в коде оставляют соответствующие виды не включёнными согласно справке.
Подсчёт относится к дереву без форматирующих пробелов, построенному этим уроком. Запуск внутри 1С здесь ещё не подтверждён.
Процедура ВыполнитьПример() Экспорт
Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьАтрибут("code", "A-01");
Атрибут = Корень.ПолучитьУзелАтрибута("code");
ФильтрАтрибута = Новый ФильтрУзловDOM(, , ПараметрыОтбораУзловDOM.ОтображатьАтрибут);
Сообщить(ФильтрАтрибута.ОтображатьАтрибут);
Атрибуты = СобратьУчебныеУзлы(Документ, Атрибут, ФильтрАтрибута);
Сообщить(Атрибуты.Количество() = 1);
Сообщить(Атрибуты[0] = Атрибут);
Сообщить(Атрибуты[0].Значение = "A-01");
Фрагмент = Документ.СоздатьФрагментДокумента();
Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("book"));
Фрагмент.ДобавитьДочерний(Документ.СоздатьЭлемент("pen"));
ФильтрФрагмента = Новый ФильтрУзловDOM(, ПараметрыОтбораУзловDOM.ОтображатьЭлемент, , , , , , , , , , ПараметрыОтбораУзловDOM.ОтображатьФрагментДокумента);
Сообщить(ФильтрФрагмента.ОтображатьФрагментДокумента);
Сообщить(ФильтрФрагмента.ОтображатьЭлемент);
Узлы = СобратьУчебныеУзлы(Документ, Фрагмент, ФильтрФрагмента);
Сообщить(Узлы.Количество() = 3);
Сообщить(Узлы[0] = Фрагмент);
Сообщить(Узлы[1].ИмяУзла = "book");
Сообщить(Узлы[2].ИмяУзла = "pen");
Сообщить(Корень.ДочерниеУзлы.Количество() = 0);
КонецПроцедуры
Функция СобратьУчебныеУзлы(Документ, Корень, Фильтр)
Результат = Новый Массив;
Итератор = Документ.СоздатьИтераторУзлов(Корень, Фильтр, Ложь);
ОшибкаОбхода = "";
Попытка
Узел = Итератор.СледующийУзел();
Пока Узел <> Неопределено Цикл
Результат.Добавить(Узел);
Узел = Итератор.СледующийУзел();
КонецЦикла;
Исключение
ОшибкаОбхода = ОписаниеОшибки();
КонецПопытки;
ОшибкаЗавершения = "";
Попытка
Итератор.Отсоединить();
Исключение
ОшибкаЗавершения = ОписаниеОшибки();
КонецПопытки;
Если Не ПустаяСтрока(ОшибкаОбхода) Или Не ПустаяСтрока(ОшибкаЗавершения) Тогда
ВызватьИсключение ОшибкаОбхода + " " + ОшибкаЗавершения;
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
Атрибут code принадлежит products, но не содержится в его ДочерниеУзлы. Передаём реальный АтрибутDOM как самостоятельный корень.
Фильтр атрибута оставляет в результате один атрибут. Его значение A-01 читаем после проверки количества.
Отдельный ФрагментДокументаDOM принадлежит тому же документу и содержит book/pen. Фрагмент ещё не вставлен в products.
Второй фильтр включает фрагмент и элементы, поэтому возвращаются сам фрагмент и два его ребёнка.
Последнее сравнение доказывает, что обход не переместил фрагмент в корень документа.
Как проверить результат
Одиннадцать проверок ожидаются Истина: четыре для атрибута и семь для фрагмента/неизменности корня.
Фрагмент остаётся отдельным контейнером; в products нет новых дочерних тегов.
Ожидаемый результат
Показано применение двух специальных видов отбора с настоящими корнями, а не ожиданием атрибутов среди детей.
На что обратить внимание
Добавление фрагмента в другой узел перемещает его детей, поэтому это другая операция и другой результат.
Не путать значение АтрибутDOM со значением ФильтрУзловDOM: типы создаются разными API.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Обойти только XML-элементы и прочитать настройки фильтра
У products два товара с текстом. Фильтр элементов возвращает три тега, но не текст Книга/Ручка и не атрибуты code.
Где и как запускать
Полный серверный общий модуль собственной учебной базы; работа с собственными DOM в памяти.
Подготовка
Собственная учебная база 8.5.1.1343. Создайте серверный общий модуль УчебныйОбходXML с флагом Сервер. Вставьте полный модуль одного урока и вызовите УчебныйОбходXML.ВыполнитьПример() из серверной команды собственной обработки.
Деревья создаются из фиксированных учебных данных. Нет чтения файлов, запросов сети, записей базы или произвольного внешнего XML.
Свойства ФильтрУзловDOM доступны только для чтения. Набор видов узлов задаётся параметрами конструктора, а не присваиванием ОтображатьЭлемент=Истина.
Параметры конструктора — значения перечисления ПараметрыОтбораУзловDOM, не Булево. Пустые позиции в коде оставляют соответствующие виды не включёнными согласно справке.
Подсчёт относится к дереву без форматирующих пробелов, построенному этим уроком. Запуск внутри 1С здесь ещё не подтверждён.
Процедура ВыполнитьПример() Экспорт
Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Для Номер = 1 По 2 Цикл
Товар = Документ.СоздатьЭлемент("product");
Товар.УстановитьАтрибут("code", ?(Номер = 1, "A-01", "B-02"));
Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(?(Номер = 1, "Книга", "Ручка")));
Корень.ДобавитьДочерний(Товар);
КонецЦикла;
ПоУмолчанию = Новый ФильтрУзловDOM;
Сообщить(СтрШаблон("ОтображатьВсе=%1", ПоУмолчанию.ОтображатьВсе));
Сообщить(СтрШаблон("ОтображатьЭлемент=%1", ПоУмолчанию.ОтображатьЭлемент));
Сообщить(СтрШаблон("ОтображатьАтрибут=%1", ПоУмолчанию.ОтображатьАтрибут));
Сообщить(СтрШаблон("ОтображатьТекст=%1", ПоУмолчанию.ОтображатьТекст));
Сообщить(СтрШаблон("ОтображатьСекцииCDATA=%1", ПоУмолчанию.ОтображатьСекцииCDATA));
Сообщить(СтрШаблон("ОтображатьСсылкуНаСущность=%1", ПоУмолчанию.ОтображатьСсылкуНаСущность));
Сообщить(СтрШаблон("ОтображатьСущность=%1", ПоУмолчанию.ОтображатьСущность));
Сообщить(СтрШаблон("ОтображатьИнструкциюОбработки=%1", ПоУмолчанию.ОтображатьИнструкциюОбработки));
Сообщить(СтрШаблон("ОтображатьКомментарий=%1", ПоУмолчанию.ОтображатьКомментарий));
Сообщить(СтрШаблон("ОтображатьДокумент=%1", ПоУмолчанию.ОтображатьДокумент));
Сообщить(СтрШаблон("ОтображатьОпределениеТипаДокумента=%1", ПоУмолчанию.ОтображатьОпределениеТипаДокумента));
Сообщить(СтрШаблон("ОтображатьФрагментДокумента=%1", ПоУмолчанию.ОтображатьФрагментДокумента));
Сообщить(СтрШаблон("ОтображатьНотацию=%1", ПоУмолчанию.ОтображатьНотацию));
ТолькоЭлементы = Новый ФильтрУзловDOM(, ПараметрыОтбораУзловDOM.ОтображатьЭлемент);
Сообщить(ТолькоЭлементы.ОтображатьЭлемент);
Сообщить(НЕ ТолькоЭлементы.ОтображатьВсе);
Элементы = СобратьУчебныеУзлы(Документ, Корень, ТолькоЭлементы);
Сообщить(Элементы.Количество() = 3);
Сообщить(Элементы[0] = Корень);
Сообщить(Элементы[1].ПолучитьАтрибут("code") = "A-01");
Сообщить(Элементы[2].ПолучитьАтрибут("code") = "B-02");
Все = Новый ФильтрУзловDOM(ПараметрыОтбораУзловDOM.ОтображатьВсе);
Сообщить(Все.ОтображатьВсе);
ВсеУзлы = СобратьУчебныеУзлы(Документ, Корень, Все);
Сообщить(ВсеУзлы.Количество() = 5);
КонецПроцедуры
Функция СобратьУчебныеУзлы(Документ, Корень, Фильтр)
Результат = Новый Массив;
Итератор = Документ.СоздатьИтераторУзлов(Корень, Фильтр, Ложь);
ОшибкаОбхода = "";
Попытка
Узел = Итератор.СледующийУзел();
Пока Узел <> Неопределено Цикл
Результат.Добавить(Узел);
Узел = Итератор.СледующийУзел();
КонецЦикла;
Исключение
ОшибкаОбхода = ОписаниеОшибки();
КонецПопытки;
ОшибкаЗавершения = "";
Попытка
Итератор.Отсоединить();
Исключение
ОшибкаЗавершения = ОписаниеОшибки();
КонецПопытки;
Если Не ПустаяСтрока(ОшибкаОбхода) Или Не ПустаяСтрока(ОшибкаЗавершения) Тогда
ВызватьИсключение ОшибкаОбхода + " " + ОшибкаЗавершения;
КонецЕсли;
Возврат Результат;
КонецФункцииРазбор по шагам
Сначала создаём фильтр без параметров и читаем все тринадцать readonly-признаков. Их фактические значения диагностические: справка конструктора по умолчанию не обещает набор включённых видов.
Для реального отбора явно создаём новый фильтр с ОтображатьЭлемент во второй позиции конструктора. Это значение перечисления, не Истина.
Итератор стартует перед корнем, поэтому products также попадает в результат элементов. Текстовые дети пропускаются, а обход поддерева продолжается.
Атрибуты code не становятся дочерними узлами product. Их читаем у найденных элементов, не ожидаем в обычном обходе.
Отдельный фильтр ОтображатьВсе показывает пять узлов: корень, два product и два текста. Каждый итератор отсоединяется после обхода и при ошибке.
Как проверить результат
Сначала тринадцать подписанных диагностических значений фильтра по умолчанию, затем восемь проверок ожидаются Истина.
Только элементы: products, product A-01, product B-02. Все узлы: дополнительно Книга и Ручка.
Ни одно readonly-свойство фильтра не должно быть присвоено.
Ожидаемый результат
Получен реальный отбор элементов, сравнение с полным обходом и честный паспорт конструктора по умолчанию.
На что обратить внимание
Не считать, что ОтображатьВсе делает атрибуты обычными детьми элемента.
Нельзя присваивать readonly-флаги после создания; создайте другой фильтр.
Не полагаться на неописанные настройки конструктора по умолчанию для критичного отбора.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.