ЧтениеУзловDOM.СледующийАтрибут

Методы · NextAttribute

Позиционирует текущее состояние объекта на следующий атрибут текущего элемента. Если вызов осуществляется при текущем узле НачалоЭлемента, то вызов аналогичен методу ЧтениеУзловDOM.ПервыйАтрибут. При этом свойствам ЧтениеУзловDOM.ТипУзла, ЧтениеУзловDOM.Имя, ЧтениеУзловDOM.ЛокальноеИмя, ЧтениеУзловDOM.Префикс, ЧтениеУзловDOM.URIПространстваИмен, ЧтениеУзловDOM.Значение и т.д. присваиваются значения, соответствующие прочитанным данным атрибута. Вызов метода ЧтениеУзловDOM.Прочитать прерывает процесс чтения атрибутов элемента и позиционирует текущий узел на следующий атрибут после НачалоЭлемента.

Синтаксис

СледующийАтрибут()
Полное описание, параметры и ограничения

ЧтениеУзловDOM.СледующийАтрибут (DOMNodeReader.NextAttribute)

ЧтениеУзловDOM (DOMNodeReader)

СледующийАтрибут (NextAttribute)

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

Синтаксис:
СледующийАтрибут()
Возвращаемое значение:
Тип: Булево.
Истина - атрибут прочитан, Ложь - атрибутов больше нет.
Описание:

Позиционирует текущее состояние объекта на следующий атрибут текущего элемента. Если вызов осуществляется при текущем узле НачалоЭлемента, то вызов аналогичен методу ЧтениеУзловDOM.ПервыйАтрибут.
При этом свойствам ЧтениеУзловDOM.ТипУзла, ЧтениеУзловDOM.Имя, ЧтениеУзловDOM.ЛокальноеИмя, ЧтениеУзловDOM.Префикс, ЧтениеУзловDOM.URIПространстваИмен, ЧтениеУзловDOM.Значение и т.д. присваиваются значения, соответствующие прочитанным данным атрибута.
Вызов метода ЧтениеУзловDOM.Прочитать прерывает процесс чтения атрибутов элемента и позиционирует текущий узел на следующий атрибут после НачалоЭлемента.

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

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

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

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

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

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

Обойти атрибуты с перемещением курсора и продолжить чтение текста

ПервыйАтрибут/СледующийАтрибут и ПрочитатьАтрибут — два способа последовательного обхода. Каждый демонстрируется на новом открытии, чтобы не смешивать состояния.

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

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

Подготовка

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

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

  3. В этом блоке каждый пример создаёт собственное дерево DOM в памяти. Файлы, сеть, данные документов и справочников не используются.

  4. Открыть у ЧтениеУзлов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") = "шт");
Исключение
    Чтение.Закрыть();
    ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();

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

  1. На начале product вызываем ПервыйАтрибут; успешный результат означает, что Имя/Значение уже описывают атрибут, а не элемент.

  2. СледующийАтрибут идёт по соседним атрибутам. Сохраняем значения в собственное соответствие по именам, не по позиции.

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

  4. Закрываем и снова открываем то же дерево. Новый проход использует только ПрочитатьАтрибут, без предварительного ПервыйАтрибут.

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

  1. Оба соответствия содержат code=A-01 и price=250; второе также m:unit=шт.

  2. После первого прохода узел Текст со значением Книга. Все логические проверки дают Истина.

  3. Собственные атрибуты заданы явно, а не взяты как значения по умолчанию из DTD.

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

Разобрана смена состояния чтения атрибутов и безопасный отдельный проход другим API.

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

  1. Не комбинируйте два последовательных обхода без повторного открытия или явного понимания текущего состояния.

  2. ЭтоАтрибутПоУмолчанию имеет смысл на атрибуте; отсутствие DTD не является проверкой достоверности данных.

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

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

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

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

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

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