Считывает очередной узел XML. При этом свойствам ЧтениеУзловDOM.ТипУзла, ЧтениеУзловDOM.Имя, ЧтениеУзловDOM.ЛокальноеИмя, ЧтениеУзловDOM.Префикс, ЧтениеУзловDOM.URIПространстваИмен и ЧтениеУзловDOM.Значение присваиваются значения, соответствующие прочитанным данным.
Синтаксис
Прочитать()Примеры платформы
Чтение.ОткрытьФайл("c:/docs/data.xml");
Пока Чтение.Прочитать() Цикл
КонецЦикла;Полное описание, параметры и ограничения
ЧтениеУзловDOM.Прочитать (DOMNodeReader.Read)
ЧтениеУзловDOM (DOMNodeReader)
Прочитать (Read)
Доступен, начиная с версии 8.1.
Синтаксис:
Прочитать()
Возвращаемое значение:
Тип: Булево.
Истина - очередной узел прочитан; Ложь - текст XML завершился.
Описание:
Считывает очередной узел XML. При этом свойствам ЧтениеУзловDOM.ТипУзла, ЧтениеУзловDOM.Имя, ЧтениеУзловDOM.ЛокальноеИмя, ЧтениеУзловDOM.Префикс, ЧтениеУзловDOM.URIПространстваИмен и ЧтениеУзловDOM.Значение присваиваются значения, соответствующие прочитанным данным.
Доступность:
Тонкий клиент, мобильный клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение (клиент), мобильное приложение (сервер), мобильный автономный сервер.
Пример:
Чтение.ОткрытьФайл("c:/docs/data.xml");
Пока Чтение.Прочитать() Цикл
// Обработка узла XML
КонецЦикла;
Использование в версии:
Доступен, начиная с версии 8.1.
Методическая информация
Практические примеры
Обойти атрибуты с перемещением курсора и продолжить чтение текста
ПервыйАтрибут/СледующийАтрибут и ПрочитатьАтрибут — два способа последовательного обхода. Каждый демонстрируется на новом открытии, чтобы не смешивать состояния.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние 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 между элементами могут быть дополнительные пробельные узлы, поэтому переход прямо на Книга относится к этому дереву без отступов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Диагностировать имя, значение и источник при чтении DOM
Начало элемента имеет имя, а последующий текст — символьное значение. Метаданные источника показываем отдельно, не выдавая дерево в памяти за прочитанный файл определённой кодировки.
Где и как запускать
Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.
Подготовка
Документы и все узлы создаются в памяти на сервере. Внешние XML, DTD, сетевые схемы и файлы не загружаются.
Сначала оставьте учебные имена и значения неизменёнными. После контрольного запуска меняйте по одному условию.
Документ = Новый ДокументDOM("", "product");
Документ.ВерсияXML = "1.0";
Документ.Автономный = Истина;
Документ.URIДокумента = "urn:guide:memory-source";
Документ.ЭлементДокумента.ДобавитьДочерний(Документ.СоздатьТекстовыйУзел("Книга"));
Чтение = Новый ЧтениеУзловDOM;
Чтение.Открыть(Документ);
Попытка
Если Чтение.ПерейтиКСодержимому() <> ТипУзлаXML.НачалоЭлемента Тогда
ВызватьИсключение "Не найден собственный корневой элемент";
КонецЕсли;
Сообщить(Чтение.ИмеетИмя);
Сообщить(Не Чтение.ЭтоСимвольныеДанные);
Сообщить(Чтение.ПубличныйИдентификатор = "");
Сообщить(Чтение.СистемныйИдентификатор = "");
Сообщить(Чтение.ИмяНотации = "");
Сообщить("Версия XML читателя: " + Чтение.ВерсияXML);
Сообщить("Автономный: " + Строка(Чтение.Автономный));
Сообщить("Кодировка из объявления: " + Чтение.КодировкаXML);
Сообщить("Кодировка источника: " + Чтение.КодировкаИсточника);
Сообщить("Базовый URI: " + Чтение.БазовыйURI);
Если Не Чтение.Прочитать() Тогда
ВызватьИсключение "Не найден учебный текст";
КонецЕсли;
Сообщить(Чтение.ТипУзла = ТипУзлаXML.Текст);
Сообщить(Чтение.ИмеетЗначение);
Сообщить(Чтение.ЭтоСимвольныеДанные);
Сообщить(Не Чтение.ЭтоПробельныеСимволы);
Сообщить(Чтение.Значение = "Книга");
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Чтение.Закрыть();Разбор по шагам
Создаём DOM в памяти, задаём версию, автономность и собственный URI-идентификатор. URI не открывается как URL и не является путём файла.
ПерейтиКСодержимому выбирает начало product. Здесь имя имеет смысл, а Public/System/Notation относятся к другим видам XML-узлов и пусты.
Версию, кодировки, автономность и базовый URI выводим как фактическую диагностику читателя. Сведения о декларации/байтовом источнике могут отличаться от вручную созданных свойств документа, поскольку файл не читался.
Прочитать переходит к тексту. ИмеетЗначение и ЭтоСимвольныеДанные показывают наличие текста, ЭтоПробельныеСимволы ложно для Книга.
Читатель закрывается после использования и при ошибке.
Как проверить результат
Все десять логических сообщений дают Истина.
Последний узел — Текст со значением Книга; три идентификатора на начале product пустые.
Пять диагностических строк источника выводят фактические значения, без требования «файл UTF-8 был прочитан».
Ожидаемый результат
Разделены флаги текущего XML-узла и сведения о происхождении/объявлении документа.
На что обратить внимание
ИмеетЗначение не означает число или допустимое бизнес-значение: текст Книга остаётся строкой.
КодировкаXML и КодировкаИсточника — разные сведения. По строке в памяти нельзя доказать, какие байты получил бы внешний сервис.
ПубличныйИдентификатор, СистемныйИдентификатор и ИмяНотации читаются согласно типу текущего узла, не как универсальные идентификаторы товара.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.