xml заменить значение атрибута

1. chmv 22.05.15 10:09 Сейчас в теме
Надо в xml файле поменять одно значение атрибута на другое
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. dj_serega 393 22.05.15 10:17 Сейчас в теме
(1) chmv, берете файлик xml. Читаете как тестовый документ и через СтрЗаменить меняете :)
9. ture 608 22.05.15 10:35 Сейчас в теме
(1) попробуйте открыть файл через модель дом, сделать селект нужному ноду, и, поменяв его атрибут, записать в новый файл весь xml
2. AnryMc 849 22.05.15 10:13 Сейчас в теме
Так поменяйте.

ЗЫ А "проблема" то в чём?
ЗЫЫ Правильно заданный вопрос - 90 % решения
3. chmv 22.05.15 10:17 Сейчас в теме
У меня есть xml файл
Там есть строка НомерВходящегоСообщения=100;
Надо после определенных действий поменять на 101;
5. ditp 93 22.05.15 10:22 Сейчас в теме
В случае относительно небольшого размера файла:
ТекстДокумент	= Новый ТекстовыйДокумент;
ТекстДокумент.Прочитать(ФайлПолноеИмя);
ТекстФайла	= ТекстДокумент.ПолучитьТекст();
ТекстФайла = СтрЗаменить(ТекстФайла, "<тег>СтароеЗначение</тег>", "<тег>СтароеЗначение</тег>");
ТекстДокумент.УстановитьТекст(ТекстФайла);
ТекстДокумент.Записать(ФайлПолноеИмя);
user1367144; sib_trip; BarsukM; ture; +4 Ответить
21. ledidinka 20.01.21 10:39 Сейчас в теме
(5) Пошла таким путем... Но после замены и сохранения файла он не открывается как XML.Если открыть получившийся файл через WordPad и просто сохранить, то после этого файл нормально открывается в браузере.
Подскажите, пожалуйста, как корректно записать текстовый документ, чтобы он открывался как XML без дополнительных действий?
6. chmv 22.05.15 10:22 Сейчас в теме
Редактирование XML ФАЙЛА
7. chmv 22.05.15 10:23 Сейчас в теме
Через текстовый долго. Файл большой. М.б. быстрее через DOM?
8. PetroP 22.05.15 10:32 Сейчас в теме
Вариантов много. Можно через текстовый документ, можно через запись XML, можно через DOM, можно через XDTO...
10. Xershi 1520 22.05.15 10:37 Сейчас в теме
ОбъектXML   = Новый ЧтениеXML;
        ОбъектXML.ОткрытьФайл(ПолныйПуть);
        ПостроительDOM = Новый ПостроительDOM;
        ДокументDOM    = ПостроительDOM.Прочитать(ОбъектXML);
        ОбъектXML.Закрыть();
       
        НужныйЭлемент  = ДокументDOM.ПолучитьЭлементыПоИмени("FunctionCode")[0];
        НужныйЭлемент.ТекстовоеСодержимое = "1";
       
        ЗаписьXML = Новый ЗаписьXML;
        ЗаписьXML.ОткрытьФайл(ПолныйПуть);
        ЗаписьDOM = Новый ЗаписьDOM;
        ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
        ЗаписьXML.Закрыть();
Показать
ducks01; rudnitskij; murat_; dmbarchenkov; AlexeyPapanov; BarsukM; igor-tit; +7 Ответить
11. ture 608 22.05.15 10:43 Сейчас в теме
(10)не не так, это через обертку от 1С. Так непродуктивно для саморазвития. Надо один раз разобраться с настоящим ДОМ, а потом всюду он узнаваться будет. Это обертку для него 1С нарисовала.
12. chmv 22.05.15 10:51 Сейчас в теме
13. ture 608 22.05.15 11:00 Сейчас в теме
(12)через ком объект:
Объект=Новый COMОбъект("Msxml2.DOMDocument.4.0");
14. ditp 93 22.05.15 11:03 Сейчас в теме
Если файл реально большой, то тащить его весь в память не очень целесообразно, неважно уже в каком виде - как текстовый документ, или как dom объект.

Возможно, параллельное использование объектов ЧтениеТекста И ЗаписьТекста, с анализом текущей строки на предмет замены, будет и быстрее, и менее ресурсоемко.
15. ture 608 22.05.15 11:05 Сейчас в теме
(14) это верно. Модель доступа только жесткая.
17. chmv 22.05.15 12:27 Сейчас в теме
Только так получилось
ИмяФайлаОбменаКИСУС="D:\Message_КИС_УС.XML";
		ФайлОбменаКИСУС = Новый ЧтениеXML;                                                                   
		ФайлОбменаКИСУС.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
		
		ПостроительDOM = Новый ПостроительDOM;
		ДокументDOM    = ПостроительDOM.Прочитать(ФайлОбменаКИСУС);
		ФайлОбменаКИСУС.Закрыть();
		для каждого стр из ДокументDOM.ДочерниеУзлы цИКЛ
			для каждого стр1 из стр.ДочерниеУзлы Цикл
				
					Попытка
				стр1.Атрибуты.ПолучитьИменованныйЭлемент("НомерВходящегоСообщения").ЗначениеУзла="221";
			Исключение
				КонецПопытки;
				
							кОНЕЦцИКЛА;	
		кОНЕЦцИКЛА;
		
		 ЗаписьXML = Новый ЗаписьXML;
		ЗаписьXML.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
		ЗаписьDOM = Новый ЗаписьDOM;
		ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
		ЗаписьXML.Закрыть();
Показать
user1115356; +1 Ответить
18. user1115356 31.08.20 11:15 Сейчас в теме
(17)
	ИмяФайлаОбменаКИСУС="c:\Users\korganov\Downloads\B661587_20081\B661587_20081.xml";
	ФайлОбменаКИСУС = Новый ЧтениеXML;
	ФайлОбменаКИСУС.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументDOM = ПостроительDOM.Прочитать(ФайлОбменаКИСУС);
	ФайлОбменаКИСУС.Закрыть();
	для каждого стр из ДокументDOM.ДочерниеУзлы цИКЛ
		
		для каждого стр1 из стр.ДочерниеУзлы Цикл
			Если стр1.ИмяУзла = "ZAP" Тогда
				для каждого стр2 из стр1.ДочерниеУзлы Цикл		
					Если стр2.ИмяУзла = "N_ZAP" Тогда
						 стр2.ТекстовоеСодержимое="222222222222221";
					КонецЕсли;
				кОНЕЦцИКЛА;
			КонецЕсли;
		кОНЕЦцИКЛА;
	кОНЕЦцИКЛА;
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.ОткрытьФайл(ИмяФайлаОбменаКИСУС);
	ЗаписьDOM = Новый ЗаписьDOM;
	ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
	ЗаписьXML.Закрыть();
Показать
19. starik-2005 3073 31.08.20 12:47 Сейчас в теме
Чета сложна вы, батенька, бутерброды кушаете...

ХМЛЧ = Новый ЧтениеХМЛ(ИмяФайла, прочаяМуть);
ХМЛЗ = Новый ЗваписьХМЛ(ИмяФайла2, прочаяМуть);
Пока ХМЛЗ.Прочитать() Цикл
  Если ХМЛЧ.ТипУзла = НачалоЭлемента Тогда
     ХМЛЗ.НачатьЗаписьЭлемента(ХМЛЧ.Имя);
  ИначеЕсли ....// не хрен тут и вариантов: атрибуты и значения - прочитали, записали, если наш - поменяли
  ...
  КонецЕсли;
КонецЦикла;
ХМЛЧ.Закрыть();
ХМЛЗ.Закрыть();
Показать


Но куда проще делается оное простым чтением текста:
Чтение = Новый ЧтениеТекста.ОткрытьФайло(ИмяФайла);
Запись = Новый ЗаписьТекста.ОткрытьФайло(ИмяФайла2);
Строка = Чтение.Прочитать();
Пока НЕ Строка = неопределено  Цикл
  Если СтрНайти(Строка, "тег/знечение/тра-та-та") тогда
    Запись.ЗаписатьСтроку("ТоНаЧтоМеняем");
  Иначе
    Запись.ЗаписатьСтроку(строка);
  КонецЕсли;
  Строка = Чтение.Прочитать();
КонецЦикла;
Чтение.Закрыть();
Запись.Закрыть();;
Показать


Но еще проще через sed (как-то так):
sed file -e s/\<tag\>data\<\/tag\>/\<tag\>newData\<\/tag\>/  >file1
Radkt; vv2; +2 Ответить
20. user1289861 16.11.20 15:52 Сейчас в теме
Рабочий пример
Процедура ПрочитатьФайлПравилИВнестиВставки(ПараметрыОбработки)
	
	ФайлПравил = ПараметрыОбработки.ФайлПравилОбмена;
	СписокУзловКЧтению = Новый СписокЗначений;
	СписокУзловКЧтению.Добавить("ПередВыгрузкойОбъекта");
	СписокУзловКЧтению.Добавить("ПослеЗагрузкиПравилОбмена");

	
	
	УзелЧитаемТекст = Ложь;
	ХМЛЧ = Новый ЧтениеXML;
	ХМЛЧ.ОткрытьФайл(ФайлПравил);  //Открываем файл
	
	ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл(ПараметрыОбработки.ПутьККаталогуПравилОбмена+"НовыеПравила.xml");
	
	Пока ХМЛЧ.Прочитать() Цикл
		
		
		Если ХМЛЧ.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			 Если СписокУзловКЧтению.НайтиПоЗначению(ХМЛЧ.Имя)<> Неопределено  Тогда
				  Сообщить("Начало чтения узла  = "+ХМЛЧ.Имя);
				  УзелЧитаемТекст = Истина;
			 КонецЕсли;	 
		     //ЗаписьXML.ЗаписатьНачалоЭлемента(ХМЛЧ.Имя); 
		     ЗаписьXML.ЗаписатьТекущий(ХМЛЧ); 
		ИначеЕсли ХМЛЧ.ТипУзла = ТипУзлаXML.Текст  и УзелЧитаемТекст Тогда
			 
				  Сообщить("Содержание узла  = "+ХМЛЧ.Значение);
		          ЗаписьXML.ЗаписатьТекст( "// новое знаечение тега"); 
			 
		ИначеЕсли ХМЛЧ.ТипУзла = ТипУзлаXML.КонецЭлемента и УзелЧитаемТекст Тогда
				  Сообщить("Конец чтения узла  = "+ХМЛЧ.Имя);
				  УзелЧитаемТекст = Ложь;
		       //   ЗаписьXML.ЗаписатьКонецЭлемента(); 
			  ЗаписьXML.ЗаписатьТекущий(ХМЛЧ); 
		иначе
			  ЗаписьXML.ЗаписатьТекущий(ХМЛЧ); 

		КонецЕсли;	 
		
	       
	КонецЦикла;
	ХМЛЧ.Закрыть();
	ЗаписьXML.Закрыть();
КонецПроцедуры
Показать
user651014_inuridinov95; Borey; +2 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот