ЧтениеXml
Стд::Xml::ЧтениеXml
Объект для последовательного чтения XML-данных. Чтение XML-данных выполняется потоково, в конкретный момент времени объект позиционируется на конкретном узле XML. При ошибке разбора XML-данных вызывается исключение ИсключениеЧтенияXml. Типы данных разбираются в соответствии со стандартом XML.
Сравнение
Ссылочное
Иерархия типа
Базовые типы: Объект
Примеры
Общие примеры
Чтение XML
Исходная строка XML
<?xml version="1.0" encoding="UTF-8"?>
<ns:Товары xmlns:ns="urn::my.test.company">
<Заголовок>
<ИдВыгрузки>21fe9796-4735-4334-84fd-6d0b0b83b517</ИдВыгрузки>
<МоментВыгрузки>2023-10-17T11:48:22Z</МоментВыгрузки>
<ДанныеОтправителяXml><![CDATA[<Отправитель>Моя тестовая компания</Отправитель>]]></ДанныеОтправителяXml>
</Заголовок>
<Товар Ид="И100" Наименование="Коробка картонная" Группа="Упаковка">
<Производитель Наименование="ОКК" Страна="РФ" Штрихкод="1234567891234"/>
<!-- Необязательный элемент -->
<Характеристики>
<Характеристика Имя="Толщина картона" Значение="5мм"/>
<Характеристика Имя="Вес" Значение="300г"/>
</Характеристики>
</Товар>
<Товар Ид="И101" Наименование="Маркер" Группа="Канцтовары">
<Производитель Наименование="GlobalMarker"/>
<!-- Необязательный элемент -->
<Характеристики>
<Характеристика Имя="Цвет" Значение="красный"/>
</Характеристики>
</Товар>
<Товар Ид="И102" Наименование="Набор крючков" Группа="ТоварыДляРыбалки">
<Производитель Наименование="PNC" Страна="Палау" Штрихкод="2234567891234"/>
</Товар>
</ns:Товары>
Код чтения XML
// Структура для хранения сообщения Товары
структура СтруктураТовары
пер Заголовок: СтруктураЗаголовок
пер Товары: Множество<СтруктураТовар>
;
// Структура для хранения заголовка выгрузки
структура СтруктураЗаголовок
пер ИдВыгрузки: Ууид
пер МоментВыгрузки: Момент
пер ДанныеОтправителяXml: Строка
;
// Структура для хранения описания товара
// Для необязательных полей используется составной тип с Неопределено
структура СтруктураТовар
пер Ид: Строка
пер Наименование: Строка
пер Группа: Строка
пер Производитель: СтруктураПроизводитель
пер Характеристики: Соответствие<Строка, Строка>?
;
// Структура для хранения описания производителя товара
// Для необязательных полей используется составной тип с Неопределено
структура СтруктураПроизводитель
пер Наименование: Строка
пер Страна: Строка?
пер Штрихкод: Число?
;
метод ПрочитатьXmlТовары(СтрокаXml: Строка): СтруктураТовары
// Переменные структур и объектов хранения данных
пер Заголовок: СтруктураЗаголовок
пер Товары: Множество<СтруктураТовар>
пер Товар: СтруктураТовар
// Переменные хранения текущего контекста
пер ЭлементЗаголовок = Ложь
пер ЭлементТовар = Ложь
// Объект чтения строки XML
знч Чтение = новый ЧтениеXml(СтрокаXml)
пока Чтение.Следующий()
// Начало элемента
если Чтение.ВидУзла == ВидУзлаXml.НачалоЭлемента
// Начало элемента Заголовок
если Чтение.ЛокальноеИмя == "Заголовок"
ЭлементЗаголовок = Истина
продолжить
;
// Обработка дочерних элементов для элемента Заголовок
если ЭлементЗаголовок
ПрочитатьЗаголовок(Чтение, Заголовок)
продолжить
;
// Начало элемента Товар
если Чтение.ЛокальноеИмя == "Товар"
ЭлементТовар = Истина
// В конструктор структуры Товар передаются значения обязательных атрибутов в порядке их следования в объявлении структуры
Товар = новый СтруктураТовар(Чтение.ЗначениеАтрибута("Ид"), Чтение.ЗначениеАтрибута("Наименование"), Чтение.ЗначениеАтрибута("Группа"))
Товары.Добавить(Товар)
продолжить
;
// Обработка дочерних элементов для элемента Товар
если ЭлементТовар
ПрочитатьТовар(Чтение, Товар)
продолжить
;
;
// Конец элемента
если Чтение.ВидУзла == ВидУзлаXml.КонецЭлемент а
// Конец элемента Заголовок
если Чтение.ЛокальноеИмя == "Заголовок"
ЭлементЗаголовок = Ложь
продолжить
;
// Конец элемента Товар
если Чтение.ЛокальноеИмя == "Товар"
ЭлементТовар = Ложь
продолжить
;
;
;
// Создание объекта с результатом чтения XML
возврат новый СтруктураТовары(Заголовок, Товары)
;
метод ПрочитатьЗаголовок(Чтение: ЧтениеXml, Заголовок: СтруктураЗаголовок)
// Начало элемента Заголовок/ИдВыгрузки
если Чтение.ЛокальноеИмя == "ИдВыгрузки"
// Если значение ИдВыгрузки отсутствует, заполняется новый идентификатор
Заголовок.ИдВыгрузки = Чтение.ЭтоПустойЭлемент() ? новый Ууид() : Чтение.Проч итатьСодержимоеКакУуид()
// Начало элемента Заголовок/МоментВыгрузки
иначе если Чтение.ЛокальноеИмя == "МоментВыгрузки"
// Если значение МоментВыгрузки отсутствует, заполняется текущий момент
Заголовок.МоментВыгрузки = Чтение.ЭтоПустойЭлемент() ? Момент.Сейчас() : Чтение.ПрочитатьСодержимоеКакМомент()
// Начало элемента Заголовок/ДанныеОтправителяXml
иначе если Чтение.ЛокальноеИмя == "ДанныеОтправителяXml"
// Значение из секции CDATA
Заголовок.ДанныеОтправителяXml = Чтение.ПрочитатьСодержимоеКакСтроку()
;
;
метод ПрочитатьТовар(Чтение: ЧтениеXml, Товар: СтруктураТовар)
// Элемент Товар/Производитель
если Чтение.ЛокальноеИмя == "Производитель"
ПрочитатьТоварПроизводитель(Чтение, Товар)
// Элемент Товар/Характеристики
иначе если Чтение.ЛокальноеИмя == "Характеристики"
Товар.Характеристики = новый Соответствие<Строка, Строка>()
// Элемент Товар/Характеристики/Характеристика
иначе если Чтение.ЛокальноеИмя == "Характеристика" и Товар.Характеристики != Неопределено
Товар.Характеристики.Вставить(Чтение.ЗначениеАтрибута("Имя"), Чтение.ЗначениеАтрибута("Значение"))
;
;
метод ПрочитатьТоварПроизводитель(Чтение: ЧтениеXml, Товар: СтруктураТовар)
// В конструктор структуры Производитель передается значение обязательного атрибута Наименование
Товар.Производитель = новый СтруктураПроизводитель(Чтение.ЗначениеАтрибута("Наименование"))
// Атрибут Cтрана является необязательным, тип Строка
// В случае отсутствия метод вернет значение Неопределено
Товар.Производитель.Страна = Чтение.ЗначениеАтрибута("Страна")
// Атрибут Штрихкод является необязательным, тип Число
// В случае отсутствия метод вернет исключение, которое требуется поймать для продолжения обработки
Товар.Производитель.Штрихкод = Неопределено
попытка
Товар.Производитель.Штрихкод = Чтение.ЗначениеАтрибутаКакЧисло("Штрихкод")
поймать И: ИсключениеНедопустимыйАргумент
;
;
Результат со строковым представлением объекта после чтения XML
// {Заголовок={ИдВыгрузки=21fe9796-4735-4334-84fd-6d0b0b83b517, МоментВыгрузки=2023-10-17T11:48:22.000Z, ДанныеОтправителяXml=<Отправитель>Моя тестовая компания</Отправитель>},
// Товары={
// {Ид=И100, Наименование=Коробка картонная, Группа=Упаковка, Производитель={Наименование=ОКК, Страна=РФ, Штрихкод=1234567891234}, Характеристики={Толщина картона: 5мм, Вес: 300г}},
// {Ид=И101, Наименование=Маркер, Группа=Канцтовары, Производитель={Наименование=GlobalMarker, Страна=undefined, Штрихкод=undefined}, Характеристики={Цвет: красный}},
// {Ид=И102, Наименование=Набор кр ючков, Группа=ТоварыДляРыбалки, Производитель={Наименование=PNC, Страна=Палау, Штрихкод=2234567891234}, Характеристики=undefined}
// }
// }
Чтение значений атрибутов и элементов различных типов
Исходная строка XML
<?xml version="1.0" encoding="UTF-8"?>
<Типы>
<Атрибуты Строка="Строка" Байты="74657374" БайтыBase64="dGVzdA" Булево="true" Время="23:59:59.999"
Дата="2023-01-01" ДатаВремя="2023-01-01T23:59:59.999" Длительность="PT144H0.005S" Момент="2020-04-16T20:30:40.345Z"
Ууид="21fe9796-4735-4334-84fd-6d0b0b83b517" Число="123.45" />
<Элементы>
<Строка>Строка</Строка>
<Байты>74657374</Байты>
<БайтыBase64>dGVzdA</БайтыBase64>
<Булево>true</Булево>
<Время>23:59:59.999</Время>
<Дата>2023-01-01</Дата>
<ДатаВремя>2023-01-01T23:59:59.999</ДатаВремя>
<Длительность>PT144H0.005S</Длительность>
<Момент>2020-04-16T20:30:40.345Z</Момент>
<Ууид>21fe9796-4735-4334-84fd-6d0b0b83b517</Ууид>
<Число>123.45</Число>
</Элементы>
</Типы>
Код чтения XML
метод ПрочитатьXmlТипы(СтрокаXml: Строка)
знч Чтение = новый ЧтениеXml(СтрокаXml)
пока Чт ение.Следующий()
если Чтение.ВидУзла == ВидУзлаXml.НачалоЭлемента
// Атрибуты
если Чтение.ЛокальноеИмя == "Атрибуты"
пер Строка = Чтение.ЗначениеАтрибута("Строка") // Строка
пер Байты = Чтение.ЗначениеАтрибутаКакБайты("Байты") // 74657374
пер БайтыBase64 = Чтение.ЗначениеАтрибутаКакБайтыBase64("БайтыBase64") // 74657374
пер Булево = Чтение.ЗначениеАтрибутаКакБулево("Булево") // Истина
пер Время = Чтение.ЗначениеАтрибутаКакВремя("Время") // 23:59:59.999
пер Дата = Чтение.ЗначениеАтрибутаКакДата("Дата") // 2023-01-01
пер ДатаВремя = Чтение.ЗначениеАтрибутаКакДатаВремя("ДатаВремя") // 2023-01-01T23:59:59.999
пер Длительность = Чтение.ЗначениеАтрибутаКакДлительность("Длительность") // 144:00:00.005
пер Момент = Чтение.ЗначениеАтрибутаКакМомент("Момент") // 2020-04-16T20:30:40.345Z
пер Ууид = Чтение.ЗначениеАтрибутаКакУуид("Ууид") // 21fe9796-4735-4334-84fd-6d0b0b83b517
пер Число = Чтение.ЗначениеАтрибутаКакЧисло("Число") // 123.45
;
// Элементы
если Чтение.ЛокальноеИмя == "Строка"
пер Строка = Чтение.ПрочитатьСодержимоеКакСтроку() // Строка
;
если Чтение.ЛокальноеИмя == "Байты"
пер Байты = Чтение.ПрочитатьСодержимоеКакБайты() // 74657374
;
если Чтение.ЛокальноеИмя == "БайтыBase64"
пер БайтыBase64 = Чтение.ПрочитатьСодержимоеКакБайтыBase64() // 74657374
;
если Чтение.ЛокальноеИмя == "Булево"
пер Булево = Чтение.ПрочитатьСодержимоеКакБулево() // Истина
;
если Чтение.ЛокальноеИмя == "Время"
пер Время = Чтение.ПрочитатьСодержимоеКакВремя() // 23:59:59.999
;
если Чтение.ЛокальноеИмя == "Дата"
пер Дата = Чтение.ПрочитатьСодержимоеКакДату() // 2023-01-01
;
если Чтение.ЛокальноеИмя == "ДатаВремя"
пер ДатаВремя = Чтение.ПрочитатьСодержимоеКакДатаВремя()// 2023-01-01T23:59:59.999
;
если Чтение.ЛокальноеИмя == "Длительность"
пер Длительность = Чтение.ПрочитатьСодержимоеКакДлительность() //144:00:00.005
;
если Чтение.ЛокальноеИмя == "Момент"
пер Момент = Чтение.ПрочитатьСодержимоеКакМомент() //2020-04-16T20:30:40.345Z
;
если Чтение.ЛокальноеИмя == "Ууид"
пер Ууид = Чтение.ПрочитатьСодержимоеКакУуид() // 21fe9796-4735-4334-84fd-6d0b0b83b517
;
если Чтение.ЛокальноеИмя == "Число"
пер Число = Чтение.ПрочитатьСодержимоеКакЧисло() // 123.45
;
;
;
;
См. также
Конструкторы
ЧтениеXml
ЧтениеXml(
Источник: Строка,
Настройки: НастройкиЧтенияXml)Источник с настройками Настройки.
ЧтениеXml
ЧтениеXml(
Источник: ПотокЧтения,
Настройки: НастройкиЧтенияXml,
Кодировка: Кодировка|Строка = Кодировка.Utf8)Источник с настройками Настройки и кодировкой Кодировка.
Перегрузка
ЧтениеXml(Источник: Строка, Настройки: НастройкиЧтенияXml)
Свойства
Автономный
ТолькоЧтение
Автономный: БулевоЗначение атрибута standalone элемента объявления XML.
Если атрибут не указан или объявление не прочитано (отсутствует), то Ложь.
ВерсияXml
ТолькоЧтение
ВерсияXml: Строка?Версия спецификации XML, которой соответствует документ XML (получается из объявления XML).
ВидУзла
ТолькоЧтение
ВидУзла: ВидУзлаXml?Вид текущего узла или Неопределено, если чтение еще не начато или уже завершено.
Значение
ТолькоЧтение
Значение: СтрокаТекстовое значение текущего узла XML. Если для узла текстовое значение не определено, то содержит пустую строку. Узлы, для которых определено текстовое значение:
СекцияCDATA- содержимое секции CDATA,Комментарий- содержимое комментария,ОпределениеТипаДокумента- внутреннее подмножество (internal subset),ИнструкцияОбработки- содержимое инструкции обработки, исключая адрес (target),Текст- содержимое текстового узла,СсылкаНаСущность- текст сущности.
Учитывается значение параметра ИгнорироватьПробелыВЗначениях. После окончания текста XML возвращает пустую строку.
ИмеетЗначение
ТолькоЧтение
ИмеетЗначение: БулевоПризнак что текущий узел содержит текстовое значения.
После окончания текста XML возвращает Ложь
ИмеетИмя
ТолькоЧтение
ИмеетИмя: БулевоПризнак наличия у текущего узла имени.
После окончания текста XML возвращает Ложь
Имя
ТолькоЧтение
Имя: СтрокаИмя текущего узла XML. Содержит квалифицированное имя для текущего узла. Имя зависит от типа текущего узла:
ОпределениеТипаДокумента- имя типа документа,НачалоЭлемента- имя элемента,КонецЭлемента- имя элемента,СсылкаНаСущность- имя ссылки на сущность,ИнструкцияОбработки- адрес инструкции обработки (target).
Для узлов, у которых имя не определено, свойство содержит пустую строку. После окончания текста XML возвращает пустую строку.
ЛокальноеИмя
ТолькоЧтение
ЛокальноеИмя: СтрокаЛокальное имя текуще го узла XML. Содержит неквалифицированное имя для текущего узла. После окончания текста XML возвращает пустую строку.
Префикс
ТолькоЧтение
Префикс: СтрокаПрефикс текущего узла. Имеет смысл для узлов типов НачалоЭлемента, КонецЭлемента.
Для узлов остальных типов или после окончания текста XML возвращает пустую строку.
ПространствоИмен
ТолькоЧтение
ПространствоИмен: СтрокаURI пространства имен текущего узла. После окончания текста XML возвращает пустую строку.
Методы
ЗначениеАтрибута
Возвращает строку, представляющую значение атрибута с именемИмя и пространством имен ПространствоИмен.
Исключения
ИсключениеНедопустимоеСостояние - если:
- тип текущего узла не НачалоЭлемента
- после окончания текста XML