Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 28 additions & 12 deletions src/Классы/СериализацияДанныхXML.os
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,17 @@
//
// Параметры:
// ПутьКФайлу - Строка - путь к файлу с данными xml
// ИспользоватьПолноеИмяУзла - Булево - читать полные имена узлов xml, локальные имена если "Ложь" (по умолчанию)
//
// Возвращаемое значение:
// Соответствие, Структура - результат чтения данных xml
//
Функция ПрочитатьИзФайла(Знач ПутьКФайлу) Экспорт
Функция ПрочитатьИзФайла(Знач ПутьКФайлу, Знач ИспользоватьПолноеИмяУзла = Ложь) Экспорт

Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ПутьКФайлу);

Результат = ПрочитатьXML(Чтение);
Результат = ПрочитатьXML(Чтение, , ИспользоватьПолноеИмяУзла);

Чтение.Закрыть();

Expand All @@ -54,7 +55,7 @@
// Выполняет сериализацию данных в файла
//
// Параметры:
// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка. Дата - данные для сериализации в XML
// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка, Дата - данные для сериализации в XML
// ПутьКФайлу - Строка - путь к файлу с данными xml
// ЗаписатьОбъявлениеXML - Булево - признак добавления записи объявления XML
//
Expand All @@ -78,12 +79,13 @@
// Параметры:
// ЧтениеXML - ЧтениеXML - <описание параметра>
// ИмяКорневогоУзла - Строка - имя текущего узла, для вызова рекурсии
// ИспользоватьПолноеИмяУзла - Булево - читать полные имена узлов xml, локальные имена если "Ложь" (по умолчанию)
//
// Возвращаемое значение:
// Соответствие, Структура - результат чтения данных xml
//
Функция ПрочитатьXML(Знач ЧтениеXML, Знач ИмяКорневогоУзла = "") Экспорт

Функция ПрочитатьXML(Знач ЧтениеXML, Знач ИмяКорневогоУзла = "", Знач ИспользоватьПолноеИмяУзла = Ложь) Экспорт
РезультатЧтения = Новый Структура;
Атрибуты = Новый Соответствие;
Элементы = Новый Соответствие;
Expand All @@ -96,7 +98,7 @@
ПрочитатьАтрибуты(ЧтениеXML, Атрибуты);

Если Не ЧтениеXML.ТипУзла = ТипУзлаXML.КонецСущности Тогда
ПрочитатьУзлы(ЧтениеXML, РезультатЧтения, ИмяКорневогоУзла);
ПрочитатьУзлы(ЧтениеXML, РезультатЧтения, ИмяКорневогоУзла, ИспользоватьПолноеИмяУзла);
КонецЕсли;

УпроститьРезультатЧтения(РезультатЧтения);
Expand All @@ -111,7 +113,7 @@
//
// Параметры:
// ЗаписьXML - ЗаписьXML - подготовленная запись ЗаписьXML
// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка. Дата - данные для сериализации в XM
// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка, Дата - данные для сериализации в XM
//
Процедура ЗаписатьXML(Знач ЗаписьXML, Знач ДанныеЗаписиXML) Экспорт

Expand Down Expand Up @@ -295,23 +297,25 @@

КонецПроцедуры

Процедура ПрочитатьУзлы(Знач ЧтениеXML, КорневойУзел, Знач ИмяКорневогоУзла)
Процедура ПрочитатьУзлы(Знач ЧтениеXML, КорневойУзел, Знач ИмяКорневогоУзла, Знач ИспользоватьПолноеИмяУзла)

Пока ЧтениеXML.Прочитать() Цикл

Лог.Отладка("Тип узла <%1>", ЧтениеXML.ТипУзла);
Лог.Отладка("Имя узла <%1>", ЧтениеXML.ЛокальноеИмя);

ИмяУзла = ИмяУзла(ЧтениеXML, ИспользоватьПолноеИмяУзла);
Лог.Отладка("Имя узла <%1>", ИмяУзла);

Если ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента
И ЧтениеXML.ЛокальноеИмя = ИмяКорневогоУзла Тогда
И ИмяУзла = ИмяКорневогоУзла Тогда
Прервать;
КонецЕсли;

Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда

ИмяНовогоУзла = ЧтениеXML.ЛокальноеИмя;
ИмяНовогоУзла = ИмяУзла(ЧтениеXML, ИспользоватьПолноеИмяУзла);
Лог.Отладка("Новый узел <%1>", ИмяНовогоУзла);
СоответствиеУзла = ПрочитатьXML(ЧтениеXML, ИмяНовогоУзла);
СоответствиеУзла = ПрочитатьXML(ЧтениеXML, ИмяНовогоУзла, ИспользоватьПолноеИмяУзла);
ВставитьЭлементУзла(КорневойУзел, ИмяНовогоУзла, СоответствиеУзла);

ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
Expand Down Expand Up @@ -376,4 +380,16 @@

КонецПроцедуры

Функция ИмяУзла(ЧтениеXML, Знач ИспользоватьПолноеИмяУзла)

Если ИспользоватьПолноеИмяУзла Тогда
ИмяУзла = ЧтениеXML.Имя;
Иначе
ИмяУзла = ЧтениеXML.ЛокальноеИмя;
КонецЕсли;

Возврат ИмяУзла;

КонецФункции

#КонецОбласти
3 changes: 3 additions & 0 deletions tests/fixtures/test-full-names.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<frst:data xmlns:frst="http://example.com/first_level" xmlns:scnd="http://example.com/second_level">
<scnd:data>Значение</scnd:data>
</frst:data>
3 changes: 3 additions & 0 deletions tests/fixtures/test-rewrite.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
<MetaDataObject xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<xr:Item xsi:type="xr:MDObjectRef">InformationRegister.РегистрСведений1</xr:Item>
</MetaDataObject>
78 changes: 62 additions & 16 deletions tests/СериализацияДанныхXML_test.os
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,9 @@
#Использовать tempfiles
#Использовать json

Перем юТест;
Перем Лог;

Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт

юТест = Тестирование;

ИменаТестов = Новый Массив;

ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеXMLВСоответствие");
ИменаТестов.Добавить("ТестДолжен_ПроверитьЗаписьXMLИзСоответствия");

Возврат ИменаТестов;

КонецФункции



&Тест
Процедура ТестДолжен_ПроверитьЧтениеXMLВСоответствие() Экспорт
Лог = Логирование.ПолучитьЛог("oscript.lib.xml-reader-test");
Лог.УстановитьУровень(УровниЛога.Отладка);
Expand All @@ -42,6 +27,7 @@
// Утверждения.ПроверитьРавенство(РезультатЧтения["ФайлПФР"][1]["ТипФайла"]["_Комментарий"], " <Запрос/> ", "Результат должен совпадать с ожиданиями.");
КонецПроцедуры

&Тест
Процедура ТестДолжен_ПроверитьЗаписьXMLИзСоответствия() Экспорт

Лог = Логирование.ПолучитьЛог("oscript.lib.xml-reader-test");
Expand All @@ -66,6 +52,66 @@

КонецПроцедуры

&Тест
&Параметры(Истина, "frst:data", "scnd:data")
&Параметры(Ложь, "data", "data")
Процедура ТестДолжен_ПроверитьЧтениеПолныхИменXML(ИспользоватьПолноеИмяУзла, ИмяУзлаПервогоУровня, ИмяУзлаВторогоУровня) Экспорт

Лог = Логирование.ПолучитьЛог("oscript.lib.xml-reader-test");

ФейковыйФайл = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "test-full-names.xml");

ПроцессорXML = Новый СериализацияДанныхXML();

РезультатЧтения = ПроцессорXML.ПрочитатьИзФайла(ФейковыйФайл, ИспользоватьПолноеИмяУзла);

УзелПервогоУровня = РезультатЧтения[ИмяУзлаПервогоУровня];
Утверждения.ПроверитьНеРавенство(УзелПервогоУровня, Неопределено, "Должен быть найден узел первого уровня");

УзелВторогоУровня = УзелПервогоУровня._Элементы[ИмяУзлаВторогоУровня];
Утверждения.ПроверитьРавенство(УзелВторогоУровня, "Значение", "Должно быть найдено значение узла второго уровня");

КонецПроцедуры

&Тест
Процедура ТестДолжен_ПроверитьСохранениеПолныхИменXMLПриПерезаписи() Экспорт

Лог = Логирование.ПолучитьЛог("oscript.lib.xml-reader-test");

ФейковыйФайл = ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "test-rewrite.xml");

ПроцессорXML = Новый СериализацияДанныхXML();

РезультатЧтенияДо = ПроцессорXML.ПрочитатьИзФайла(ФейковыйФайл, Истина);

ВременныйФайл = ВременныеФайлы.НовоеИмяФайла("xml");

ПроцессорXML.ЗаписатьВФайл(РезультатЧтенияДо, ВременныйФайл);

РезультатЧтенияПосле = ПроцессорXML.ПрочитатьИзФайла(ВременныйФайл, Истина);

Утверждения.ПроверитьРавенство(
РезультатЧтенияДо["MetaDataObject"]._Атрибуты["xmlns:xr"],
РезультатЧтенияПосле["MetaDataObject"]._Атрибуты["xmlns:xr"],
"Значения после перезаписи должны совпадать");

Утверждения.ПроверитьРавенство(
РезультатЧтенияДо["MetaDataObject"]._Атрибуты["xmlns:xsi"],
РезультатЧтенияПосле["MetaDataObject"]._Атрибуты["xmlns:xsi"],
"Значения после перезаписи должны совпадать");

Утверждения.ПроверитьРавенство(
РезультатЧтенияДо["MetaDataObject"]._Элементы["xr:Item"]._Значение,
РезультатЧтенияПосле["MetaDataObject"]._Элементы["xr:Item"]._Значение,
"Значения после перезаписи должны совпадать");

Утверждения.ПроверитьРавенство(
РезультатЧтенияДо["MetaDataObject"]._Элементы["xr:Item"]._Атрибуты["xmlns:xsi"],
РезультатЧтенияПосле["MetaDataObject"]._Элементы["xr:Item"]._Атрибуты["xmlns:xsi"],
"Значения после перезаписи должны совпадать");

КонецПроцедуры

Процедура ПоказатьНастройкиВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "") Экспорт

Если Не Лог.Уровень() = УровниЛога.Отладка Тогда
Expand Down