/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
v2.0.0
tests/xmlwrite.os
761 строка
42 KB
Sergey Batanov
Инструкции обработки в ЗаписатьТекущий.
16 сен 2025, 09:38
16 сен 2025, 09:38
26c189f
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////// // // Приемочные тесты объекта ЗаписьXML // // /////////////////////////////////////////////////////////////////////// Перем юТест; //////////////////////////////////////////////////////////////////// // Программный интерфейс Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт юТест = ЮнитТестирование; ВсеТесты = Новый Массив; ВсеТесты.Добавить("ТестДолжен_ЗаписатьВСтроку"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьВФайл"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьВФайл_BOM"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьВФайл_БезBOM"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьСоответствиеПространстваИмен"); ВсеТесты.Добавить("ТестДолжен_ПроверитьКонтекстПространствИменВоВремяЗаписи"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьВСтрокуСОтступомТабами"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьВСтрокуБезПробелаПередЗакрытием"); ВсеТесты.Добавить("ТестДолжен_ПроверитьПравильныйВыводПробелСлэша"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекст"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_БезЧтения"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_НачалоЭлемента"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_НачалоВложенногоЭлемента"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлемента"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСОпределениемПространстваИмен"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСПерекрывающимОпределениемПространстваИмен"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСЛишнимПереопределениемПространстваИмен"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_КонецЭлемента"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_Текст"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_CDATA"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_Комментарий"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_СсылкаНаСушность"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ПолноеКопирование"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ИнструкцииОбработки"); ВсеТесты.Добавить("ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента"); Возврат ВсеТесты; КонецФункции Процедура ТестДолжен_ЗаписатьВСтроку() Экспорт З = Новый ЗаписьXML; З.УстановитьСтроку("windows-1251"); ЗаписатьСодержимое(З); С = З.Закрыть(); НормализоватьПереводыСтрок(С); юТест.ПроверитьРавенство(ЭталонДокумента(), С); КонецПроцедуры Процедура ТестДолжен_ЗаписатьВСтрокуСОтступомТабами() Экспорт СтрокаОтступа = Символы.Таб + " | "; З = Новый ЗаписьXML(); З.УстановитьСтроку(Новый ПараметрыЗаписиXML("windows-1251",,,, СтрокаОтступа)); ЗаписатьСодержимое(З); С = З.Закрыть(); НормализоватьПереводыСтрок(С); юТест.ПроверитьРавенство(ЭталонДокумента(СтрокаОтступа), С); КонецПроцедуры Процедура ТестДолжен_ЗаписатьВФайл() Экспорт ВремФайл = КаталогВременныхФайлов() + "/os-xml-write-test.xml"; З = Новый ЗаписьXML; З.ОткрытьФайл(ВремФайл, "windows-1251"); С = ""; Попытка ЗаписатьСодержимое(З); З.Закрыть(); Чтение = Новый ЧтениеТекста(ВремФайл, "windows-1251"); С = Чтение.Прочитать(); Чтение.Закрыть(); Исключение УдалитьВременныйФайл(ВремФайл); ВызватьИсключение; КонецПопытки; УдалитьВременныйФайл(ВремФайл); НормализоватьПереводыСтрок(С); юТест.ПроверитьРавенство(ЭталонДокумента(), С); КонецПроцедуры Процедура ПроверитьЗаписьВУТФ_СБОМ_БезБОМ(СБом) ВремФайл = КаталогВременныхФайлов() + "/os-xml-write-test.xml"; З = Новый ЗаписьXML; З.ОткрытьФайл(ВремФайл, "UTF-8", СБОМ); С = ""; Попытка З.ЗаписатьНачалоЭлемента("root"); З.ЗаписатьКонецЭлемента(); З.Закрыть(); Ф = Новый Файл(ВремФайл); Чтение = Новый ЧтениеТекста(ВремФайл); Содержимое = Чтение.Прочитать(); Чтение.Закрыть(); Исключение УдалитьВременныйФайл(ВремФайл); ВызватьИсключение; КонецПопытки; РазмерФайла = Ф.Размер(); УдалитьВременныйФайл(ВремФайл); ТеоретическийРазмерФайла = СтрДлина(Содержимое) + ?(СБОМ, 3, 0); // + размер BOM юТест.ПроверитьРавенство(РазмерФайла, ТеоретическийРазмерФайла); КонецПроцедуры Процедура ТестДолжен_ЗаписатьВФайл_BOM() Экспорт ПроверитьЗаписьВУТФ_СБОМ_БезБОМ(Истина); КонецПроцедуры Процедура ТестДолжен_ЗаписатьВФайл_БезBOM() Экспорт ПроверитьЗаписьВУТФ_СБОМ_БезБОМ(Ложь); КонецПроцедуры Функция ЭталонДокумента(Знач СтрокаОтступа = " ") Текст = СтрЗаменить( "<?xml version=""1.0"" encoding=""windows-1251""?> |<Привет xmlns:тест=""http://beaversoft.ru/oscript/test""> | <Сообщение>Это текст <---></Сообщение> |</Привет>", Символы.Таб, СтрокаОтступа); НормализоватьПереводыСтрок(Текст); Возврат Текст; КонецФункции Процедура ЗаписатьСодержимое(ЗаписьXML) ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента("Привет"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("тест","http://beaversoft.ru/oscript/test"); ЗаписьXML.ЗаписатьНачалоЭлемента("Сообщение"); ЗаписьXML.ЗаписатьТекст("Это текст <--->"); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура УдалитьВременныйФайл(Знач ВремФайл) Ф = Новый Файл(ВремФайл); Если Ф.Существует() Тогда //УдалитьФайлы(Ф.ПолноеИмя); КонецЕсли; КонецПроцедуры Процедура НормализоватьПереводыСтрок(Строка) Строка = СтрЗаменить(Строка, Символы.ВК + Символы.ПС, Символы.ПС); КонецПроцедуры Процедура ТестДолжен_ЗаписатьСоответствиеПространстваИмен() Экспорт ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьXML.ЗаписатьНачалоЭлемента("opm-metadata"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "http://oscript.io/schemas/opm-metadata/1.0"); ЗаписьXML.ЗаписатьНачалоЭлемента("test"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v2", "http://oscript.io/schemas/opm-metadata/2.0"); юТест.ПроверитьРавенство(ЗаписьXML.НайтиПрефикс("http://oscript.io/schemas/opm-metadata/2.0"), "v2", "Пространство имён 2"); юТест.ПроверитьРавенство(ЗаписьXML.НайтиПрефикс("http://oscript.io/schemas/opm-metadata/1.0"), "", "Пространство имён по-умолчанию"); юТест.ПроверитьРавенство(ЗаписьXML.НайтиПрефикс("http://oscript.io/schemas/opm-metadata/x.x"), Неопределено, "Не заданное пространство имён"); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.ЗаписатьКонецЭлемента(); Текст = ЗаписьXML.Закрыть(); Чтение = Новый ЧтениеXML; Чтение.УстановитьСтроку(Текст); Чтение.ПерейтиКСодержимому(); юТест.ПроверитьРавенство(Чтение.ПолучитьАтрибут("xmlns"), "http://oscript.io/schemas/opm-metadata/1.0"); Чтение.Закрыть(); КонецПроцедуры Процедура ТестДолжен_ПроверитьКонтекстПространствИменВоВремяЗаписи() Экспорт ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); // Проверим, что скрипт не падает, когда ничего не начали записывать НеПадает = ЗаписьXML.КонтекстПространствИмен.СоответствияПространствИмен(); ЗаписьXML.ЗаписатьНачалоЭлемента("Корень"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.Глубина, 1); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("", "Пространство"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("П1", "ЕщёПространство"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.ПространствоИменПоУмолчанию, "Пространство"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.НайтиURIПространстваИмен("П1"), "ЕщёПространство"); ЗаписьXML.ЗаписатьНачалоЭлемента("Дитё"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.ПространствоИменПоУмолчанию, "Пространство"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.НайтиURIПространстваИмен("П1"), "ЕщёПространство"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("П2", "Пространство2"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.НайтиURIПространстваИмен("П2"), "Пространство2"); ЗаписьXML.ЗаписатьКонецЭлемента(); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.ПространствоИменПоУмолчанию, "Пространство"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.НайтиURIПространстваИмен("П1"), "ЕщёПространство"); юТест.ПроверитьРавенство(ЗаписьXML.КонтекстПространствИмен.НайтиURIПространстваИмен("П2"), Неопределено); ЗаписьXML.ЗаписатьКонецЭлемента(); КонецПроцедуры Процедура ТестДолжен_ЗаписатьВСтрокуБезПробелаПередЗакрытием() Экспорт ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент"); ЗаписьXML.ЗаписатьАтрибут("Атрибут", "Значение"); ЗаписьXML.ЗаписатьКонецЭлемента(); СтрокаПроверки = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство(СтрокаПроверки, "<Элемент Атрибут=""Значение""/>"); КонецПроцедуры Процедура ТестДолжен_ПроверитьПравильныйВыводПробелСлэша() Экспорт ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент"); ЗаписьXML.ЗаписатьАтрибут("Атрибут", XmlСтрока(" /")); ЗаписьXML.ЗаписатьКонецЭлемента(); СтрокаПроверки = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство(СтрокаПроверки, "<Элемент Атрибут="" /""/>"); ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(); ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент"); ЗаписьXML.ЗаписатьТекст(XmlСтрока(" /")); ЗаписьXML.ЗаписатьКонецЭлемента(); СтрокаПроверки = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство(СтрокаПроверки, "<Элемент> /</Элемент>"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекст() Экспорт Запись = Новый ЗаписьXML; Запись.УстановитьСтроку(); Запись.ЗаписатьНачалоЭлемента("root"); Запись.ЗаписатьТекст("123"); Запись.ЗаписатьКонецЭлемента(); Результат = Запись.Закрыть(); юТест.ПроверитьРавенство(Результат, "<root>123</root>"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_БезЧтения() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("", ПолученныйТекст, "Ничего не прочитано - ничего не пишется"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_НачалоЭлемента() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<xml xmlns:ns=""ns"" attr=""1"" ns:attr=""value"" />", // dotnet автоматом закроет элемент ПолученныйТекст, "Первый элемент"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_НачалоВложенногоЭлемента() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<ns:data inner=""123"" inner2=""456"" inner3=""789"" />", // dotnet автоматом закроет элемент ПолученныйТекст, "Второй элемент"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлемента() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ЧтениеXML.ПервыйАтрибут(); ЧтениеXML.СледующийАтрибут(); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл inner2=""456"" />", // dotnet автоматом закроет элемент ПолученныйТекст, "Второй атрибут"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСОпределениемПространстваИмен() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ЧтениеXML.Пропустить(); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<ins:data>"); ЧтениеXML.ПервыйАтрибут(); ЧтениеXML.СледующийАтрибут(); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство( "<эл xmlns:ins=""inner namespace mapping"" ins:attr=""1"" />", // dotnet автоматом закроет элемент ПолученныйТекст, "Автоматически добавляется определение пространства имен"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСЛишнимПереопределениемПространстваИмен() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ЧтениеXML.Пропустить(); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<ins:data>"); ЧтениеXML.ПервыйАтрибут(); ЧтениеXML.СледующийАтрибут(); ЗаписьXML.ЗаписатьНачалоЭлемента("корень"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ins", "inner namespace mapping"); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство( "<корень xmlns:ins=""inner namespace mapping""><эл ins:attr=""1"" /></корень>", // dotnet автоматом закроет элементы ПолученныйТекст, "Определение пространства имен не добавляется"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_АтрибутВнутриЭлементаСПерекрывающимОпределениемПространстваИмен() Экспорт // BSLLS:LineLength-off Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ЧтениеXML.Пропустить(); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<ins:data>"); ЧтениеXML.ПервыйАтрибут(); ЧтениеXML.СледующийАтрибут(); ЗаписьXML.ЗаписатьНачалоЭлемента("корень"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("ins2", "inner namespace mapping"); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство( "<корень xmlns:ins2=""inner namespace mapping""><эл xmlns:ins=""inner namespace mapping"" ins:attr=""1"" /></корень>", // dotnet автоматом закроет элементы ПолученныйТекст, "Определение пространства имен добавляется, так как не совпадают префиксы"); // BSLLS:LineLength-on КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_КонецЭлемента() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ЧтениеXML.ПервыйАтрибут(); ЧтениеXML.СледующийАтрибут(); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст, "Some Value"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента, "</data>"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл inner2=""456""/>", ПолученныйТекст, "Закрытие элемента"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_Текст() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<data>"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст, "Спозиционированы на текст Some text"); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл>Some Text</эл>", ПолученныйТекст, "Текст"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_CDATA() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "cdata"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.СекцияCDATA); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьСекциюCDATA(", к которому добавили ещё текст"); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл><![CDATA[Некоторый текст]]><![CDATA[, к которому добавили ещё текст]]></эл>", ПолученныйТекст, "CDATA"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_Комментарий() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "БлокСКомментарием"); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ПробельныеСимволы); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Комментарий); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьТекст("Текст"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); // можем записать ещё раз ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл> <!-- Комментарий -->Текст<!-- Комментарий --></эл>", ПолученныйТекст, "Комментарий"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_ПолноеКопирование() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); Пока ЧтениеXML.Прочитать() Цикл ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); КонецЦикла; ЗаписьXML.Закрыть(); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_ОбъявлениеИТипДокумента() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОбъявлениеXML, "<?xml>"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ОпределениеТипаДокумента, "<!DOCTYPE>"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.НачалоЭлемента, "<xml>"); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенствоСтрокБезУчетаРегистра( "<?xml version=""1.0"" encoding=""UTF-8""?><!DOCTYPE example[]><эл/>", ПолученныйТекст, "Объявления и тип документа"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_СсылкаНаСушность() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "entity"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.СсылкаНаСущность); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл>&СсылкаНаСущность;</эл>", ПолученныйТекст, "Ссылка на сущность"); ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "entity2"); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.Текст); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.СсылкаНаСущность); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл>Это &СсылкаНаСущность;</эл>", ПолученныйТекст, "Ссылка на сущность внутри текста"); КонецПроцедуры Процедура ТестДолжен_ЗаписатьТекущий_ИнструкцииОбработки() Экспорт Перем ЧтениеXML, ЗаписьXML; ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "PI"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ИнструкцияОбработки); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); // Несовместимость: dotnet всегда добавляет пробел, даже если нет текста инструкции юТест.ПроверитьРавенство("<эл><?инструкция ?></эл>", // ^ ПолученныйТекст, "Инструкция обработки"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента); ЧтениеXML.Прочитать(); // ПодготовитьЗаписьXML(ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "PI"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ИнструкцияОбработки); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл><?инструкция с произвольным текстом внутри?></эл>", ПолученныйТекст, "Инструкция обработки с текстом"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.КонецЭлемента); ЧтениеXML.Прочитать(); // ПодготовитьЗаписьXML(ЗаписьXML); ДойтиДоИмени(ЧтениеXML, "PI"); ПрочитатьИПроверитьТип(ЧтениеXML, ТипУзлаXML.ИнструкцияОбработки); ЗаписьXML.ЗаписатьНачалоЭлемента("эл"); ЗаписьXML.ЗаписатьТекущий(ЧтениеXML); ЗаписьXML.ЗаписатьКонецЭлемента(); ПолученныйТекст = ЗаписьXML.Закрыть(); юТест.ПроверитьРавенство("<эл><?инструкция с произвольным текстом внутри и <служебными символами>?></эл>", ПолученныйТекст, "Инструкция обработки с текстом и служебными символами"); КонецПроцедуры Процедура ПодготовитьТестовыеДанныеДляЗаписиТекущего(ЧтениеXML, ЗаписьXML) ПодопытныйТекст = "<?xml version=""1.0"" encoding=""UTF-8""?> |<!DOCTYPE example SYSTEM ""example.dtd""> |<xml xmlns:ns=""ns"" attr=""1"" ns:attr=""value""> | <ns:data inner=""123"" inner2=""456"" inner3=""789"">Some Text</ns:data> | <ins:data xmlns:ins=""inner namespace mapping"" ins:attr=""1""></ins:data> | <cdata><![CDATA[Некоторый текст]]></cdata> | <БлокСКомментарием> <!-- Комментарий --> </БлокСКомментарием> | <entity>&СсылкаНаСущность;</entity> | <entity2>Это &СсылкаНаСущность;</entity2> | <PI><?инструкция?></PI> | <PI><?инструкция с произвольным текстом внутри?></PI> | <PI><?инструкция с произвольным текстом внутри и <служебными символами>?></PI> |</xml>" ; ПараметрыЧтения = Новый ПараметрыЧтенияXml( , // Версия , // Язык , // ПробельныеСимволы , // ТипПроверкиПравильности, Ложь, // ИгнорироватьОбъявлениеXML Ложь, // ИгнорироватьТипДокумента Ложь, // ИгнорироватьИнструкцииОбработки Ложь, // ИгнорироватьКомментарии Ложь, // ИгнорироватьПробельныеСимволы Ложь, // СекцииCDATAКакТекст Истина // ИспользоватьИгнорируемыеПробельныеСимволы ); ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ПодопытныйТекст, ПараметрыЧтения); ПодготовитьЗаписьXML(ЗаписьXML); КонецПроцедуры Процедура ПодготовитьЗаписьXML(ЗаписьXML) ПараметрыЗаписи = Новый ПараметрыЗаписиXml(, , Ложь); // без переносов ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку(ПараметрыЗаписи); КонецПроцедуры Функция ДойтиДоИмени(Знач ЧтениеXML, Знач Имя) Пока ЧтениеXML.Имя <> Имя Цикл Если Не ЧтениеXML.Прочитать() Тогда Возврат Ложь; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции Процедура ПрочитатьИПроверитьТип(Знач ЧтениеXML, Знач ТипУзла, Знач Сообщение = Неопределено) ЧтениеXML.Прочитать(); юТест.ПроверитьРавенство(ЧтениеXML.ТипУзла, ТипУзла, Сообщение); КонецПроцедуры