ИнструкцияОбработкиDOM.ДочерниеУзлы

Свойства · ChildNodes

Тип: СписокУзловDOM. Список дочерних узлов DOM. В случае отсутствия дочерних узлов содержит пустой список.

Полное описание, параметры и ограничения

ИнструкцияОбработкиDOM.ДочерниеУзлы (DOMProcessingInstruction.ChildNodes)

ИнструкцияОбработкиDOM (DOMProcessingInstruction)

ДочерниеУзлы (ChildNodes)

Доступен, начиная с версии 8.1.

Использование:
Только чтение.
Описание:
Тип: СписокУзловDOM.
Список дочерних узлов DOM. В случае отсутствия дочерних узлов содержит пустой список.
Доступность:

Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.

Использование в версии:

Доступен, начиная с версии 8.1.

Методическая информация

Практические примеры

Сравнить восемь видов узлов XML на одном созданном дереве

Получаем настоящие документ, элемент, атрибут, текст, комментарий, CDATA, инструкцию и фрагмент. Таблица объясняет, почему одни свойства имеют значение, а другие — Неопределено.

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

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

Подготовка

  1. Выполняйте на сервере учебной базы; документ и все восемь узлов полностью создаются в памяти.

  2. Фрагмент намеренно не вставляется в основной документ: это отдельный контейнер с элементом note.

  3. Поставьте точку останова после цикла и откройте Диагностика в отладчике, чтобы сравнить все шестнадцать колонок.

Документ = Новый Документ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);
Сообщить(Документ.ДокументВладелец = Неопределено);
Сообщить(Атрибут.РодительскийУзел = Неопределено);
Сообщить(Атрибут.ЭлементВладелец.УзелИдентичен(Корень));
Сообщить(Текст.ЗначениеУзла = "Книга");
Сообщить(Корень.ЗначениеУзла = Неопределено);
Сообщить(Корень.ТекстовоеСодержимое = "Книга<данные>");
Сообщить(Комментарий.ТекстовоеСодержимое = "учебный комментарий");
Сообщить(Фрагмент.РодительскийУзел = Неопределено);

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

  1. Свойства общего узла доступны у разных конкретных видов, но их значения отличаются: ИмяУзла #text — не имя товара.

  2. ЗначениеУзла содержит значение текста и атрибута, но не текст элемента. ТекстовоеСодержимое элемента объединяет текст и CDATA, исключая комментарии и инструкции.

  3. РодительскийУзел и ДокументВладелец — разные связи. У атрибута нет родителя дерева, но есть ЭлементВладелец; у документа нет документа-владельца.

  4. Первый/ПоследнийДочерний и соседние узлы могут быть Неопределено. ДочерниеУзлы всё равно предоставляет список, в том числе пустой.

  5. Атрибуты предоставляет коллекцию только у элемента. Проверяем Неопределено до вызова Количество.

  6. URIПространстваИмен, ЛокальноеИмя и Префикс описывают квалифицированное имя; БазовыйURI относится к разрешению URI, а не к адресу товара.

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

  1. Диагностика содержит восемь строк разных видов; проверки наличия детей и атрибутов совпадают с размерами коллекций.

  2. У корня четыре дочерних узла, а ТекстовоеСодержимое равно Книга<данные>, без комментария и mode=test.

  3. Атрибут A-01 не является дочерним узлом корня; его ЭлементВладелец совпадает с корнем.

  4. Фрагмент имеет одного ребёнка note, но пока не имеет родителя в основном дереве.

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

Построена диагностическая таблица реальных узлов, которая разделяет имя, значение, текст, связи и пространства имён.

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

  1. ТекстовоеСодержимое — не сериализованный XML; для разметки используйте ЗаписьDOM.

  2. Значение Неопределено не означает повреждение: для некоторых видов узлов это предусмотренное поведение.

  3. Коллекция атрибутов не обязана сохранять порядок. XML-префикс — псевдоним URI, а не идентификатор бизнес-объекта.

  4. Нельзя произвольно назначать родителя или владельца: эти связи управляются методами дерева.

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

Понять, почему у текста, CDATA, комментария и инструкции нет дочерних элементов

Наличие общих методов DOM у листового узла не означает, что он может содержать element. Проверяем отказы и сохраняем значения четырёх реальных видов узлов.

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

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

Подготовка

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

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

  3. Преобразования выполняются только над собственным XML в памяти. Примеры не читают файлы, внешние DTD, URL или данные информационной базы.

  4. У методов DOM возвращаемый узел сохраняйте в переменную: исходная ссылка и результат операции не всегда обозначают один объект.

Документ = Новый ДокументDOM("", "product");
Листья = Новый Массив;
Листья.Добавить(Документ.СоздатьТекстовыйУзел("Книга"));
Листья.Добавить(Документ.СоздатьСекциюCDATA("<описание>"));
Листья.Добавить(Документ.СоздатьКомментарий("Учебный товар"));
Листья.Добавить(Документ.СоздатьИнструкциюОбработки("guide", "mode=test"));
Для Каждого Лист Из Листья Цикл
    ПрежнееЗначение = Лист.ЗначениеУзла;
    Кандидат = Документ.СоздатьЭлемент("note");
    Отказов = 0;
    Попытка
        Лист.ДобавитьДочерний(Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.ВставитьПеред(Кандидат, Неопределено);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.ЗаменитьДочерний(Кандидат, Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Попытка
        Лист.УдалитьДочерний(Кандидат);
    Исключение
        Отказов = Отказов + 1;
    КонецПопытки;
    Если Отказов <> 4 Тогда
        ВызватьИсключение "Неожиданно принята недопустимая операция над листовым узлом";
    КонецЕсли;
    Лист.Нормализовать();
    Сообщить(СтрШаблон("%1: ожидаемых отказов %2", ТипЗнч(Лист), Отказов));
    Сообщить(Лист.ДочерниеУзлы.Количество() = 0);
    Сообщить(Лист.ЗначениеУзла = ПрежнееЗначение);
    Сообщить(Кандидат.РодительскийУзел = Неопределено);
КонецЦикла;

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

  1. Создаём четыре листовых узла. Ни один не содержит детей; candidate note тоже принадлежит тому же документу, чтобы не спутать ошибку иерархии с другим владельцем.

  2. Добавление и вставка элемента запрещены для этих видов узлов. Замена/удаление также не находят существующего ребёнка: candidate не находится у листа.

  3. Каждую ожидаемую ошибку считаем отдельно. Проверка общего количества выполняется вне этих блоков, иначе можно ошибочно засчитать собственное контрольное исключение.

  4. Нормализовать допустим как общий метод, но у листа нечего объединять. Значение и пустой список детей не меняются.

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

  1. Для каждого из четырёх видов выводится ожидаемых отказов 4.

  2. Для каждого вида три логические проверки дают Истина: нет детей, значение прежнее, candidate отсоединён.

  3. Всего 16 ожидаемых отказов. Ни один не подавляет неожиданное успешное изменение: оно вызовет контрольную ошибку.

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

Объяснено поведение общих методов на листовых узлах вместо фиктивного примера добавления невозможных детей.

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

  1. Этот пример намеренно демонстрирует ошибки на собственных данных; в рабочем алгоритме проверяйте вид узла заранее.

  2. Для описания с вложенными тегами создавайте ЭлементDOM-контейнер и помещайте в него текст/элементы. ТекстDOM сам контейнером не является.

  3. Не переносите правило на АтрибутDOM: его представление значения может включать текстовые дочерние узлы, это другой вид DOM-узла.

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

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

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

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

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