Последовательно обойти DOM, включая текстовые узлы

Учебные задачи

Итератор видит не только товары, но и корень и текстовые узлы. Обходим вперёд до конца, возвращаемся назад и освобождаем итератор.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.

  2. Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.


Документ = Новый ДокументDOM("", "products");
Корень = Документ.ЭлементДокумента;
Для Номер = 1 По 2 Цикл
    Товар = Документ.СоздатьЭлемент("product");
    Товар.УстановитьАтрибут("code", ?(Номер = 1, "A-01", "B-02"));
    Товар.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел(?(Номер = 1, "Книга", "Ручка")));
    Корень.ДобавитьДочерний(Товар);
КонецЦикла;

Итератор = Документ.СоздатьИтераторУзлов(Корень, , Ложь);
Сообщить(Итератор.Корень = Корень);
Сообщить(Не Итератор.РаскрыватьСсылкиНаСущности);
Пройдено = 0;
Узел = Итератор.СледующийУзел();
Пока Узел <> Неопределено Цикл
    Пройдено = Пройдено + 1;
    Сообщить(СтрШаблон("%1: %2; тип %3", Пройдено, Узел.ИмяУзла, Узел.ТипУзла));
    Узел = Итератор.СледующийУзел();
КонецЦикла;
Сообщить(Пройдено = 5);
Последний = Итератор.ПредыдущийУзел();
Если Последний = Неопределено Тогда
    ВызватьИсключение "Не найден последний узел учебного дерева";
КонецЕсли;
Сообщить(Последний.ТекстовоеСодержимое = "Ручка");
Итератор.Отсоединить();
Сообщить("Итератор отсоединён: дальнейшие методы обхода не вызываются");

Разбор по шагам

  1. Корень итератора ограничивает область обхода деревом products. В учебном документе два товара и два текстовых ребёнка.

  2. Отбор не передаём, поэтому обход включает и элементы, и текст. Начальная позиция позволяет первым получить корень.

  3. СледующийУзел возвращает Неопределено после конца. ПредыдущийУзел позволяет вернуться к последнему пройденному узлу.

  4. Отсоединить освобождает итератор. После этого объект не используем для нового обхода.

Как проверить результат

  1. Порядок узлов: products, product, текст Книга, product, текст Ручка; всего 5.

  2. После обратного шага текстовое содержимое равно Ручка.

  3. Сравнение корня и проверка РаскрыватьСсылкиНаСущности дают Истина.

Ожидаемый результат

Разобран последовательный DOM-обход с текстовыми узлами и завершением работы итератора.

На что обратить внимание

  1. Красиво оформленный разобранный XML может иметь дополнительные пробельные текстовые узлы, поэтому количество 5 относится только к построенному дереву.

  2. Не путайте ИтераторУзловDOM с результатом-итератором XPath: это разные объекты и методы.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.