ЧтениеFastInfoset.ПерейтиКСодержимому

Методы · MoveToContent

Проверяет является ли текущий узел "содержимым" (Текст, НачалоЭлемента, КонецЭлемента, СсылкаНаСущность или КонецСущности). Если текущий узел не является "содержимым", то выполняется пропуск узлов до "содержимого" или же до конца источника данных XML. Возвращает значение узла, в который был перемещен текущий узел, Ничего - в случае достижения конца источника данных XML.

Синтаксис

ПерейтиКСодержимому()
Полное описание, параметры и ограничения

ЧтениеFastInfoset.ПерейтиКСодержимому (FastInfosetReader.MoveToContent)

ЧтениеFastInfoset (FastInfosetReader)

ПерейтиКСодержимому (MoveToContent)

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

Синтаксис:
ПерейтиКСодержимому()
Возвращаемое значение:
Тип: ТипУзлаXML.
Значение узла, в который был перемещен текущий узел; Ничего - в случае достижения конца источника данных XML.
Описание:

Проверяет является ли текущий узел "содержимым" (Текст, НачалоЭлемента, КонецЭлемента, СсылкаНаСущность или КонецСущности).
Если текущий узел не является "содержимым", то выполняется пропуск узлов до "содержимого" или же до конца источника данных XML.
Возвращает значение узла, в который был перемещен текущий узел, Ничего - в случае достижения конца источника данных XML.

Доступность:

Сервер, толстый клиент, внешнее соединение.

Примечание:
Будут пропущены следующие типы узлов: ОбъявлениеXML, ИнструкцияОбработки, ОпределениеТипаДокумента, Комментарий.
Использование в версии:

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

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

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

Пропустить служебную ветку и не потерять товар после неё

Собственный документ содержит ignored с вложенным шумом и следующий product A-01. Пропустить уже перемещает reader; в этой ветке обычное Прочитать не вызывается.

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

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

Подготовка

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

  2. Все документы создаются из собственных строк и чисел в памяти. Не подставляйте файл XML, бинарный архив обмена, ссылки или данные рабочей базы вместо учебных значений.

  3. Fast Infoset — двоичное представление XML. Для чтения нужен соответствующий reader, а не преобразование байтов в UTF-8-строку. Это не формат API Avito и не автоматическое сжатие произвольного JSON.

  4. Запуск в 1С ещё не подтверждён; выполните контрольные проверки в учебной базе. Не сравнивайте точные байты двух кодировщиков: в заданиях проверяется восстановленная структура и значения.

Запись = Новый ЗаписьFastInfoset;
Запись.УстановитьДвоичныеДанные();
Попытка
    Запись.ЗаписатьКомментарий("Перед корнем");
    Запись.ЗаписатьНачалоЭлемента("products");
    Запись.ЗаписатьНачалоЭлемента("ignored");
    Запись.ЗаписатьНачалоЭлемента("noise");
    Запись.ЗаписатьТекст("Пропускаемый учебный текст");
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьНачалоЭлемента("product");
    Запись.ЗаписатьАтрибут("code", "A-01");
    Запись.ЗаписатьАтрибут("quantity", "3");
    Запись.ЗаписатьТекст("Книга");
    Запись.ЗаписатьКонецЭлемента();
    Запись.ЗаписатьКонецЭлемента();
    Данные = Запись.Закрыть();
Исключение
    Запись.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Если ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
    ВызватьИсключение "Не получены собственные Fast Infoset-данные";
КонецЕсли;
Сообщить(Данные.Размер() > 0);
Чтение = Новый ЧтениеFastInfoset;
Чтение.УстановитьДвоичныеДанные(Данные);
Попытка
    ТипСодержимого = Чтение.ПерейтиКСодержимому();
    Сообщить(ТипСодержимого = ТипУзлаXML.НачалоЭлемента);
    Товаров = 0;
    Код = "";
    Пока Чтение.ТипУзла <> ТипУзлаXML.Ничего Цикл
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "ignored" Тогда
            Чтение.Пропустить();
            Продолжить;
        КонецЕсли;
        Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента И Чтение.Имя = "product" Тогда
            Товаров = Товаров + 1;
            Код = Чтение.ПолучитьАтрибут("code");
        КонецЕсли;
        Чтение.Прочитать();
    КонецЦикла;
    Сообщить(Товаров = 1);
    Сообщить(Код = "A-01");
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();

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

  1. ПерейтиКСодержимому пропускает комментарий и возвращает тип найденного содержимого.

  2. Цикл завершается по Ничего — отсутствию следующего узла XML, не по имени последнего тега.

  3. На ignored вызываем Пропустить и Продолжить: новая позиция будет обработана с начала следующей итерации.

  4. Обычное Прочитать выполняется только на ветке обычной обработки.

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

  1. Четыре проверки Истина: байты, НачалоЭлемента, один товар и его код A-01.

  2. Пропускаемый шум не обрабатывается как товар, а product сразу после ветки не теряется.

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

Показано управление позицией reader при пропуске поддерева.

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

  1. Пропустить — операция позиционирования, не фильтр без изменения состояния.

  2. Не добавляйте второе Прочитать сразу после Пропустить: можно потерять следующий узел.

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

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

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

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

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