UPD: для конкретной задачи метод получается избыточным, и для больших файлов использование ДокументDOM не рекомендуется стандартами разработки (тут бы должен быть пруф). А подобная задача решается перебором xml через ЧтениеXML и создание нового через ЗаписьXML с подменной или добавлением не достающих атрибутов.
// Функция - Установить атрибуты DOM // // Параметры: // ДокументDOM - ДокументDOM - Обязательный. // XPathВыражение - Строка - XPath выражение выполняется относительно корня ДокументDOM // Атрибуты - Массив - коллекция объектов с обязательными свойствами: Имя, Значение // // Возвращаемое значение: // - Булево - признак модификации ДокументDOM // // Пример использования: установим атрибуты width, heigh узла svg // // СтрокаXPath = "//svg[1]"; // только первый элемент svg относительно корня документа // СтрокаXPath = "//*[translate(name(), 'SVG', 'svg') = 'svg'][1]"; // регистронезависимая маска поиска узла документа // // Атрибуты = Новый Массив; // Атрибуты.Добавить( Новый Структура("Имя,Значение", "width", "100")); // Атрибуты.Добавить( Новый Структура("Имя,Значение", "heigh", "100")); // // ИсточникДанныхXML = Новый ЧтениеXML; // ИсточникДанныхXML.УстановитьСтроку(СтрокаXML); // // ПостроительDOM = Новый ПостроительDOM; // ДокументDOM = ПостроительDOM.Прочитать(ИсточникДанныхXML); // // УстановитьАтрибутыDOM(ДокументDOM, СтрокаXPath, Атрибуты); // // ЗаписьXML = Новый ЗаписьXML; // ЗаписьXML.УстановитьСтроку(ИсточникДанныхXML.КодировкаXML); // // ЗаписьDOM = Новый ЗаписьDOM(); // ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML); // // СтрокаXML = ЗаписьXML.Закрыть(); // &НаКлиентеНаСервереБезКонтекста Функция УстановитьАтрибутыDOM(ДокументDOM, XPathВыражение, Атрибуты) Результат = Ложь; Разыменователь = Новый РазыменовательПространствИменDOM(ДокументDOM); РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(XPathВыражение, ДокументDOM, Разыменователь); Элемент = РезультатXPath.ПолучитьСледующий(); Пока Элемент <> Неопределено Цикл Если ТипЗнч(Элемент) = Тип("ЭлементDOM") Тогда Для Каждого Атрибут Из Атрибуты Цикл Элемент.УстановитьАтрибут(Атрибут.Имя, Атрибут.Значение); Результат = Истина; КонецЦикла; КонецЕсли; Элемент = РезультатXPath.ПолучитьСледующий(); КонецЦикла; Возврат Результат; КонецФункции
// Функция - Установить атрибуты DOM // // Параметры: // ДокументDOM - ДокументDOM - Обязательный. // XPathВыражение - Строка - XPath выражение выполняется относительно корня ДокументDOM // Атрибуты - Массив - коллекция объектов с обязательными свойствами: Имя, Значение // // Возвращаемое значение: // - Булево - признак модификации ДокументDOM // // Пример использования: установим атрибуты width, heigh узла svg // // СтрокаXPath = "//svg[1]"; // только первый элемент svg относительно корня документа // СтрокаXPath = "//*[translate(name(), 'SVG', 'svg') = 'svg'][1]"; // регистронезависимая маска поиска узла документа // // Атрибуты = Новый Массив; // Атрибуты.Добавить( Новый Структура("Имя,Значение", "width", "100")); // Атрибуты.Добавить( Новый Структура("Имя,Значение", "heigh", "100")); // // ИсточникДанныхXML = Новый ЧтениеXML; // ИсточникДанныхXML.УстановитьСтроку(СтрокаXML); // // ПостроительDOM = Новый ПостроительDOM; // ДокументDOM = ПостроительDOM.Прочитать(ИсточникДанныхXML); // // УстановитьАтрибутыDOM(ДокументDOM, СтрокаXPath, Атрибуты); // // ЗаписьXML = Новый ЗаписьXML; // ЗаписьXML.УстановитьСтроку(ИсточникДанныхXML.КодировкаXML); // // ЗаписьDOM = Новый ЗаписьDOM(); // ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML); // // СтрокаXML = ЗаписьXML.Закрыть(); // &НаКлиентеНаСервереБезКонтекста Функция УстановитьАтрибутыDOM(ДокументDOM, XPathВыражение, Атрибуты) Результат = Ложь; Разыменователь = Новый РазыменовательПространствИменDOM(ДокументDOM); РезультатXPath = ДокументDOM.ВычислитьВыражениеXPath(XPathВыражение, ДокументDOM, Разыменователь); Элемент = РезультатXPath.ПолучитьСледующий(); Пока Элемент <> Неопределено Цикл Если ТипЗнч(Элемент) = Тип("ЭлементDOM") Тогда Для Каждого Атрибут Из Атрибуты Цикл Элемент.УстановитьАтрибут(Атрибут.Имя, Атрибут.Значение); Результат = Истина; КонецЦикла; КонецЕсли; Элемент = РезультатXPath.ПолучитьСледующий(); КонецЦикла; Возврат Результат; КонецФункции
Комментарии
Отправить комментарий