Создает новый иерархический объект обхода дерева документа DOM, начиная с указанного корневого узла. Метод соответствует интерфейсу Treewalker стандарта W3C (Подробнее см. http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/traversal.html#Traversal-TreeWalker).
Синтаксис
СоздатьОбходДерева(<Узел>, <Отбор>, <ОбходитьСсылкиНаСущности>)Полное описание, параметры и ограничения
ДокументDOM.СоздатьОбходДерева (DOMDocument.CreateTreeWalker)
ДокументDOM (DOMDocument)
СоздатьОбходДерева (CreateTreeWalker)
Доступен, начиная с версии 8.1.
Синтаксис:
СоздатьОбходДерева(<Узел>, <Отбор>, <ОбходитьСсылкиНаСущности>)
Параметры:
<Узел> (обязательный)
Тип: АтрибутDOM, ДокументDOM, ЭлементDOM, ОпределениеТипаДокументаDOM, НотацияDOM, СущностьDOM, ФрагментДокументаDOM, ТекстDOM, КомментарийDOM, СекцияCDATADOM, ИнструкцияОбработкиDOM, СсылкаНаСущностьDOM, ПространствоИменXPath.
Узел DOM - стартовый узел итератора.
<Отбор> (необязательный)
Тип: ФильтрУзловDOM.
Отбор узлов DOM.
Если не указан, то будут проитерированы все узлы.
<ОбходитьСсылкиНаСущности> (необязательный)
Тип: Булево.
Признак обхода ссылок на сущности DOM.
Истина - при обходе узла ссылки на сущность будет производиться обход узлов содержимого сущности, в противном случае обход производиться не будет.
Значение по умолчанию: Истина.
Возвращаемое значение:
Тип: ОбходДереваDOM.
Описание:
Создает новый иерархический объект обхода дерева документа DOM, начиная с указанного корневого узла.
Метод соответствует интерфейсу Treewalker стандарта W3C (Подробнее см. http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113/traversal.html#Traversal-TreeWalker).
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Навигировать по DOM через родителя, детей и соседей
ОбходДереваDOM хранит текущую позицию. Последовательно перемещаем её и проверяем, какой именно узел выбран после каждого шага.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Для Номер = 1 По 2 Цикл
Товар = Документ.СоздатьЭлемент("product");
Товар.УстановитьАтрибут("code", ?(Номер = 1, "A-01", "B-02"));
Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(?(Номер = 1, "Книга", "Ручка")));
Корень.ДобавитьДочерний(Товар);
КонецЦикла;
Обход = Документ.СоздатьОбходДерева(Корень, , Ложь);
Сообщить(Обход.Корень = Корень);
Сообщить(Обход.ТекущийУзел = Корень);
Сообщить(Не Обход.РаскрыватьСсылкиНаСущности);
ПервыйТовар = Обход.ПервыйДочерний();
Если ПервыйТовар = Неопределено Тогда
ВызватьИсключение "Нет первого товара в учебном дереве";
КонецЕсли;
Сообщить(ПервыйТовар.ПолучитьАтрибут("code") = "A-01");
ТекстКниги = Обход.ПоследнийДочерний();
Если ТекстКниги = Неопределено Тогда
ВызватьИсключение "Нет текста первого товара";
КонецЕсли;
Сообщить(ТекстКниги.ТекстовоеСодержимое = "Книга");
Сообщить(Обход.РодительскийУзел() = ПервыйТовар);
ВторойТовар = Обход.СледующийСоседний();
Если ВторойТовар = Неопределено Тогда
ВызватьИсключение "Нет второго товара";
КонецЕсли;
Сообщить(ВторойТовар.ПолучитьАтрибут("code") = "B-02");
Сообщить(Обход.ПредыдущийСоседний() = ПервыйТовар);
Обход.ТекущийУзел = Корень;
Сообщить(Обход.ПоследнийДочерний() = ВторойТовар);
Сообщить(Обход.ПредыдущийУзел() = ТекстКниги);
Сообщить(Обход.СледующийУзел() = ВторойТовар);
Обход.ТекущийУзел = Корень;
Сообщить(Обход.РодительскийУзел() = Неопределено);
Сообщить(Обход.ТекущийУзел = Корень);Разбор по шагам
Обход начинается на Корне. ПервыйДочерний переводит позицию на первого ребёнка и возвращает его.
Соседние перемещения остаются на одном уровне. РодительскийУзел возвращает на уровень выше внутри области обхода.
Присваивание ТекущийУзел явно меняет позицию. ПредыдущийУзел/СледующийУзел следуют порядку обхода всего дерева, не только соседей.
Выше корня области обход не выходит: попытка получить его родителя возвращает Неопределено, позиция остаётся на Корне.
Как проверить результат
ПервыйТовар имеет A-01, его текст Книга; следующий сосед имеет B-02.
ПредыдущийУзел от второго товара — текст первого; СледующийУзел возвращает на второй товар.
Все логические проверки Истина, в конце текущая позиция снова Корень.
Ожидаемый результат
На одном дереве отработаны направления навигации и явное восстановление позиции.
На что обратить внимание
Метод навигации меняет состояние обхода. Не считайте его простым чтением свойства без побочного эффекта.
Узел, возвращённый методом, может быть Неопределено на границе. Не обращайтесь к его данным без проверки.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.