Проверяет является ли текущий узел "содержимым" (Текст, НачалоЭлемента, КонецЭлемента, СсылкаНаСущность или КонецСущности). Если текущий узел не является "содержимым", то выполняется пропуск узлов до "содержимого" или же до конца источника данных XML. Возвращает значение узла, в который был перемещен текущий узел, Ничего - в случае достижения конца источника данных XML.
Синтаксис
ПерейтиКСодержимому()Полное описание, параметры и ограничения
ЧтениеУзловDOM.ПерейтиКСодержимому (DOMNodeReader.MoveToContent)
ЧтениеУзловDOM (DOMNodeReader)
ПерейтиКСодержимому (MoveToContent)
Доступен, начиная с версии 8.2.
Синтаксис:
ПерейтиКСодержимому()
Возвращаемое значение:
Тип: ТипУзлаXML.
Значение узла, в который был перемещен текущий узел; Ничего - в случае достижения конца источника данных XML.
Описание:
Проверяет является ли текущий узел "содержимым" (Текст, НачалоЭлемента, КонецЭлемента, СсылкаНаСущность или КонецСущности).
Если текущий узел не является "содержимым", то выполняется пропуск узлов до "содержимого" или же до конца источника данных XML.
Возвращает значение узла, в который был перемещен текущий узел, Ничего - в случае достижения конца источника данных XML.
Доступность:
Тонкий клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Примечание:
Будут пропущены следующие типы узлов: ОбъявлениеXML, ИнструкцияОбработки, ОпределениеТипаДокумента, Комментарий.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Обойти атрибуты с перемещением курсора и продолжить чтение текста
ПервыйАтрибут/СледующийАтрибут и ПрочитатьАтрибут — два способа последовательного обхода. Каждый демонстрируется на новом открытии, чтобы не смешивать состояния.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
В этом блоке каждый пример создаёт собственное дерево DOM в памяти. Файлы, сеть, данные документов и справочников не используются.
Открыть у ЧтениеУзловDOM принимает узел, а у ЗаписьУзловDOM — документ-владелец будущих узлов. Это не открытие файла.
URI = "urn:guide:products";
URIЕдиниц = "urn:guide:units";
Документ = Новый ДокументDOM(URI, "g:product");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", URI);
Корень.УстановитьСоответствиеПространстваИмен("m", URIЕдиниц);
Корень.УстановитьАтрибут("code", "A-01");
Корень.УстановитьАтрибут("price", "250");
АтрибутЕдиницы = Документ.СоздатьАтрибут(URIЕдиниц, "m:unit");
АтрибутЕдиницы.Значение = "шт";
Корень.УстановитьУзелАтрибута(АтрибутЕдиницы);
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Книга"));
Чтение = Новый ЧтениеУзловDOM;
Чтение.Открыть(Документ);
Попытка
Чтение.ПерейтиКСодержимому();
Значения = Новый Соответствие;
ЕстьАтрибут = Чтение.ПервыйАтрибут();
Пока ЕстьАтрибут Цикл
Сообщить(Чтение.ТипУзла = ТипУзлаXML.Атрибут);
Значения.Вставить(Чтение.Имя, Чтение.Значение);
Сообщить("Из DTD по умолчанию: " + Строка(Чтение.ЭтоАтрибутПоУмолчанию));
ЕстьАтрибут = Чтение.СледующийАтрибут();
КонецЦикла;
Сообщить(Значения.Получить("code") = "A-01");
Сообщить(Значения.Получить("price") = "250");
Если Не Чтение.Прочитать() Тогда
ВызватьИсключение "Ожидался текст после атрибутов";
КонецЕсли;
Сообщить(Чтение.ТипУзла = ТипУзлаXML.Текст);
Сообщить(Чтение.Значение = "Книга");
Чтение.Закрыть();
Чтение.Открыть(Документ);
Чтение.ПерейтиКСодержимому();
ВторыеЗначения = Новый Соответствие;
Пока Чтение.ПрочитатьАтрибут() Цикл
ВторыеЗначения.Вставить(Чтение.Имя, Чтение.Значение);
КонецЦикла;
Сообщить(ВторыеЗначения.Получить("code") = "A-01");
Сообщить(ВторыеЗначения.Получить("m:unit") = "шт");
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Разбор по шагам
На начале product вызываем ПервыйАтрибут; успешный результат означает, что Имя/Значение уже описывают атрибут, а не элемент.
СледующийАтрибут идёт по соседним атрибутам. Сохраняем значения в собственное соответствие по именам, не по позиции.
После обхода Прочитать завершает чтение атрибутов и продолжает основной поток: на этом дереве следующим узлом будет текст Книга.
Закрываем и снова открываем то же дерево. Новый проход использует только ПрочитатьАтрибут, без предварительного ПервыйАтрибут.
Как проверить результат
Оба соответствия содержат code=A-01 и price=250; второе также m:unit=шт.
После первого прохода узел Текст со значением Книга. Все логические проверки дают Истина.
Собственные атрибуты заданы явно, а не взяты как значения по умолчанию из DTD.
Ожидаемый результат
Разобрана смена состояния чтения атрибутов и безопасный отдельный проход другим API.
На что обратить внимание
Не комбинируйте два последовательных обхода без повторного открытия или явного понимания текущего состояния.
ЭтоАтрибутПоУмолчанию имеет смысл на атрибуте; отсутствие DTD не является проверкой достоверности данных.
У реального XML между элементами могут быть дополнительные пробельные узлы, поэтому переход прямо на Книга относится к этому дереву без отступов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Прочитать XML-атрибуты по имени и построить диагностическую таблицу
Индексы начинаются с нуля, но порядок атрибутов не является бизнес-контрактом. Для загрузки code/price/unit используем имена и URI.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
В этом блоке каждый пример создаёт собственное дерево DOM в памяти. Файлы, сеть, данные документов и справочников не используются.
Открыть у ЧтениеУзловDOM принимает узел, а у ЗаписьУзловDOM — документ-владелец будущих узлов. Это не открытие файла.
URI = "urn:guide:products";
URIЕдиниц = "urn:guide:units";
Документ = Новый ДокументDOM(URI, "g:product");
Корень = Документ.ЭлементДокумента;
Корень.УстановитьСоответствиеПространстваИмен("g", URI);
Корень.УстановитьСоответствиеПространстваИмен("m", URIЕдиниц);
Корень.УстановитьАтрибут("code", "A-01");
Корень.УстановитьАтрибут("price", "250");
АтрибутЕдиницы = Документ.СоздатьАтрибут(URIЕдиниц, "m:unit");
АтрибутЕдиницы.Значение = "шт";
Корень.УстановитьУзелАтрибута(АтрибутЕдиницы);
Корень.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Книга"));
Чтение = Новый ЧтениеУзловDOM;
Чтение.Открыть(Документ);
Попытка
Если Чтение.ПерейтиКСодержимому() <> ТипУзлаXML.НачалоЭлемента Тогда
ВызватьИсключение "Ожидался собственный корневой элемент";
КонецЕсли;
Сообщить(Чтение.Имя = "g:product");
Сообщить(Чтение.ЛокальноеИмя = "product");
Сообщить(Чтение.Префикс = "g");
Сообщить(Чтение.URIПространстваИмен = URI);
Сообщить(Чтение.ЗначениеАтрибута("code") = "A-01");
Сообщить(Чтение.ПолучитьАтрибут("price") = "250");
Сообщить(Чтение.ЗначениеАтрибута("unit", URIЕдиниц) = "шт");
Сообщить(Чтение.ПолучитьАтрибут("missing") = Неопределено);
Диагностика = Новый ТаблицаЗначений;
Диагностика.Колонки.Добавить("ПолноеИмя");
Диагностика.Колонки.Добавить("ЛокальноеИмя");
Диагностика.Колонки.Добавить("Префикс");
Диагностика.Колонки.Добавить("URI");
Диагностика.Колонки.Добавить("ТипАтрибута");
Диагностика.Колонки.Добавить("Значение");
Для Индекс = 0 По Чтение.КоличествоАтрибутов() - 1 Цикл
СтрокаАтрибута = Диагностика.Добавить();
СтрокаАтрибута.ПолноеИмя = Чтение.ИмяАтрибута(Индекс);
СтрокаАтрибута.ЛокальноеИмя = Чтение.ЛокальноеИмяАтрибута(Индекс);
СтрокаАтрибута.Префикс = Чтение.ПрефиксАтрибута(Строка(Индекс));
СтрокаАтрибута.URI = Чтение.URIПространстваИменАтрибута(Индекс);
СтрокаАтрибута.ТипАтрибута = Чтение.ТипАтрибута(Индекс);
СтрокаАтрибута.Значение = Чтение.ЗначениеАтрибута(Индекс);
Сообщить(СтрокаАтрибута.ПолноеИмя + " = " + СтрокаАтрибута.Значение);
КонецЦикла;
Сообщить(Диагностика.Количество() = Чтение.КоличествоАтрибутов());
Сообщить(Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента);
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();
Разбор по шагам
ПерейтиКСодержимому ставит чтение на начало product; только после этого обращаемся к его атрибутам.
Именованные варианты отличают отсутствие атрибута (Неопределено) от пустого значения существующего атрибута.
Для диагностики обходятся все индексы. В поле ПрефиксАтрибута индекс передаём строкой согласно сигнатуре локальной справки 8.5; остальные индексные методы принимают число.
Индексные методы и ПолучитьАтрибут/ЗначениеАтрибута читают данные без перехода на атрибут. В конце текущий узел всё ещё НачалоЭлемента.
Как проверить результат
Десять логических проверок дают Истина.
Диагностика содержит code=A-01, price=250, m:unit=шт. Не требуйте конкретного порядка строк; определения пространств имён рассматривайте отдельно от бизнес-атрибутов.
price возвращается строкой 250, не числом: преобразование числа и валидация внешнего ввода — отдельная задача.
Ожидаемый результат
Атрибуты извлечены без изменения позиции и без предположений об их порядке.
На что обратить внимание
Сначала проверяйте тип узла. Доступ к атрибутам текста или конца элемента не является чтением атрибутов предыдущего товара.
Не ищите unit только по буквам m:unit, если префикс может измениться: используйте локальное имя и URI.
Для недоверенных XML проверяйте обязательность, формат, длину и допустимость каждого бизнес-значения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.