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"],
+ "Значения после перезаписи должны совпадать");
+
+КонецПроцедуры
+
Процедура ПоказатьНастройкиВРежимеОтладки(ЗначенияПараметров, Знач Родитель = "") Экспорт
Если Не Лог.Уровень() = УровниЛога.Отладка Тогда