From 5997453e80826cb181f5248334fb6a8431af3ff5 Mon Sep 17 00:00:00 2001 From: Vasiliy Sokolov Date: Tue, 18 Nov 2025 14:15:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=BB=D0=BD=D0=BE=D0=B5=20=D0=B8?= =?UTF-8?q?=D0=BC=D1=8F=20=D1=83=D0=B7=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...260\320\275\320\275\321\213\321\205XML.os" | 40 +++++++--- tests/fixtures/test-full-names.xml | 3 + tests/fixtures/test-rewrite.xml | 3 + ...20\275\320\275\321\213\321\205XML_test.os" | 78 +++++++++++++++---- 4 files changed, 96 insertions(+), 28 deletions(-) create mode 100644 tests/fixtures/test-full-names.xml create mode 100644 tests/fixtures/test-rewrite.xml diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML.os" index d2c2cd8..a4cf702 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML.os" @@ -34,16 +34,17 @@ // // Параметры: // ПутьКФайлу - Строка - путь к файлу с данными xml +// ИспользоватьПолноеИмяУзла - Булево - читать полные имена узлов xml, локальные имена если "Ложь" (по умолчанию) // // Возвращаемое значение: // Соответствие, Структура - результат чтения данных xml // -Функция ПрочитатьИзФайла(Знач ПутьКФайлу) Экспорт +Функция ПрочитатьИзФайла(Знач ПутьКФайлу, Знач ИспользоватьПолноеИмяУзла = Ложь) Экспорт Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(ПутьКФайлу); - Результат = ПрочитатьXML(Чтение); + Результат = ПрочитатьXML(Чтение, , ИспользоватьПолноеИмяУзла); Чтение.Закрыть(); @@ -54,7 +55,7 @@ // Выполняет сериализацию данных в файла // // Параметры: -// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка. Дата - данные для сериализации в XML +// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка, Дата - данные для сериализации в XML // ПутьКФайлу - Строка - путь к файлу с данными xml // ЗаписатьОбъявлениеXML - Булево - признак добавления записи объявления XML // @@ -78,12 +79,13 @@ // Параметры: // ЧтениеXML - ЧтениеXML - <описание параметра> // ИмяКорневогоУзла - Строка - имя текущего узла, для вызова рекурсии +// ИспользоватьПолноеИмяУзла - Булево - читать полные имена узлов xml, локальные имена если "Ложь" (по умолчанию) // // Возвращаемое значение: // Соответствие, Структура - результат чтения данных xml // -Функция ПрочитатьXML(Знач ЧтениеXML, Знач ИмяКорневогоУзла = "") Экспорт - +Функция ПрочитатьXML(Знач ЧтениеXML, Знач ИмяКорневогоУзла = "", Знач ИспользоватьПолноеИмяУзла = Ложь) Экспорт + РезультатЧтения = Новый Структура; Атрибуты = Новый Соответствие; Элементы = Новый Соответствие; @@ -96,7 +98,7 @@ ПрочитатьАтрибуты(ЧтениеXML, Атрибуты); Если Не ЧтениеXML.ТипУзла = ТипУзлаXML.КонецСущности Тогда - ПрочитатьУзлы(ЧтениеXML, РезультатЧтения, ИмяКорневогоУзла); + ПрочитатьУзлы(ЧтениеXML, РезультатЧтения, ИмяКорневогоУзла, ИспользоватьПолноеИмяУзла); КонецЕсли; УпроститьРезультатЧтения(РезультатЧтения); @@ -111,7 +113,7 @@ // // Параметры: // ЗаписьXML - ЗаписьXML - подготовленная запись ЗаписьXML -// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка. Дата - данные для сериализации в XM +// ДанныеЗаписиXML - Соответствие, Массив, Структура, Число, Строка, Дата - данные для сериализации в XM // Процедура ЗаписатьXML(Знач ЗаписьXML, Знач ДанныеЗаписиXML) Экспорт @@ -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.Текст Тогда @@ -376,4 +380,16 @@ КонецПроцедуры +Функция ИмяУзла(ЧтениеXML, Знач ИспользоватьПолноеИмяУзла) + + Если ИспользоватьПолноеИмяУзла Тогда + ИмяУзла = ЧтениеXML.Имя; + Иначе + ИмяУзла = ЧтениеXML.ЛокальноеИмя; + КонецЕсли; + + Возврат ИмяУзла; + +КонецФункции + #КонецОбласти \ No newline at end of file diff --git a/tests/fixtures/test-full-names.xml b/tests/fixtures/test-full-names.xml new file mode 100644 index 0000000..1fb4563 --- /dev/null +++ b/tests/fixtures/test-full-names.xml @@ -0,0 +1,3 @@ + + Значение + diff --git a/tests/fixtures/test-rewrite.xml b/tests/fixtures/test-rewrite.xml new file mode 100644 index 0000000..e55fbfa --- /dev/null +++ b/tests/fixtures/test-rewrite.xml @@ -0,0 +1,3 @@ + + InformationRegister.РегистрСведений1 + diff --git "a/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML_test.os" "b/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML_test.os" index 0dbd132..a83df23 100644 --- "a/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML_test.os" +++ "b/tests/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\224\320\260\320\275\320\275\321\213\321\205XML_test.os" @@ -5,24 +5,9 @@ #Использовать tempfiles #Использовать json -Перем юТест; Перем Лог; -Функция ПолучитьСписокТестов(Знач Тестирование) Экспорт - - юТест = Тестирование; - - ИменаТестов = Новый Массив; - - ИменаТестов.Добавить("ТестДолжен_ПроверитьЧтениеXMLВСоответствие"); - ИменаТестов.Добавить("ТестДолжен_ПроверитьЗаписьXMLИзСоответствия"); - - Возврат ИменаТестов; - -КонецФункции - - - +&Тест Процедура ТестДолжен_ПроверитьЧтениеXMLВСоответствие() Экспорт Лог = Логирование.ПолучитьЛог("oscript.lib.xml-reader-test"); Лог.УстановитьУровень(УровниЛога.Отладка); @@ -42,6 +27,7 @@ // Утверждения.ПроверитьРавенство(РезультатЧтения["ФайлПФР"][1]["ТипФайла"]["_Комментарий"], " <Запрос/> ", "Результат должен совпадать с ожиданиями."); КонецПроцедуры +&Тест Процедура ТестДолжен_ПроверитьЗаписьXMLИзСоответствия() Экспорт Лог = Логирование.ПолучитьЛог("oscript.lib.xml-reader-test"); @@ -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"], + "Значения после перезаписи должны совпадать"); + +КонецПроцедуры + Процедура ПоказатьНастройкиВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "") Экспорт Если Не Лог.Уровень() = УровниЛога.Отладка Тогда