Прекращает чтение XML из узла DOM. Если никакого чтения в момент вызова данного метода не выполнялось, то метод ничего не делает.
Синтаксис
Закрыть()Полное описание, параметры и ограничения
ЧтениеУзловDOM.Закрыть (DOMNodeReader.Close)
ЧтениеУзловDOM (DOMNodeReader)
Закрыть (Close)
Доступен, начиная с версии 8.1.
Синтаксис:
Закрыть()
Описание:
Прекращает чтение XML из узла DOM. Если никакого чтения в момент вызова данного метода не выполнялось, то метод ничего не делает.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер), мобильный автономный сервер.
Использование в версии:
Доступен, начиная с версии 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 между элементами могут быть дополнительные пробельные узлы, поэтому переход прямо на Книга относится к этому дереву без отступов.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Прочитать 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 проверяйте обязательность, формат, длину и допустимость каждого бизнес-значения.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.