Редактирование файла xml

1. user1883378 01.05.23 03:26 Сейчас в теме
Всем добрый день!
Сейчас пишу интеграционный механизм для 1С с приложением, у которого данные хранятся в xml формате.
При определенных условиях необходимо программно заменить значение атрибута
например: <атрибут>1234</атрибут> нужно поменять на <атрибут>2345</атрибут>
Подскажите пожалуйста, как это можно реализовать?
2 день бьюсь над этой проблемой...
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
6. independ 1551 01.05.23 13:53 Сейчас в теме
(1)
Текст = Новый ЧтениеТекста("C:\файл.xml", КодировкаТекста.UTF8);
Строка=СтрЗаменить(Текст.Прочитать(),"<атрибут>1234</атрибут>","<атрибут>2345</атрибут>");
Текст = Новый ЗаписьТекста("C:\файл.xml", КодировкаТекста.UTF8);
Текст.Записать(Строка); 
Текст.Закрыть();
starik-2005; EvgeniyOlxovskiy; karamazoff; user856012; +4 Ответить
7. user856012 14 01.05.23 14:25 Сейчас в теме
(6) Поддерживаю... если только сейчас не выяснится, что заменять надо не во всем файле, а в отдельных местах, в зависимости от ХЗ знает чего - например, от значения других атрибутов.

На это намекает "При определенных условиях" в (1) - подробности, видимо, надо выпытывать... шампуром? :-)

Автор, если предложенный коллегой метод вас устраивает - поздравляю! А если нет, то поймите и усвойте на будущее: "Краткость, конечно, сестра таланта... но не единственная!"
2. starjevschik 01.05.23 10:00 Сейчас в теме
В любом текстовом редакторе. А еще есть специальные редакторы XML.
3. user1883378 01.05.23 11:19 Сейчас в теме
(2) мне программно надо)
4. user856012 14 01.05.23 12:11 Сейчас в теме
(3)
мне программно надо
Программно где? В файле? Или в базе 1С? Программный код при этом будет отличаться, вам не кажется?

И вообще, лучше покажите то, над чем "2 день бьетесь" - вам скорее подскажут, где ошибки и как исправить.

А то телепаты все на шашлыках, жарят... кого надо. ;-)
5. user1883378 01.05.23 12:49 Сейчас в теме
(4) Вот именно, что показывать особо нечего. Не могу понять, как записывать.
В файле надо изменять значение атрибута
Пишу внешнюю обработку в самой 1С
То есть файл xml программно открывается в 1С, ищется нужный атрибут с нужным значением и дальше записывается в файле xml и закрывается
логика примерно такая
есть же, наверное, алгоритмы какие-то для изменения значения...я ж не первая такое пробую писать))

Пока находит и читает вот так:

ЧтениеXML = Новый XMLReader;
	ЧтениеXML .SetString(локОбъектXML.xml);
	
	
	Пока ЧтениеXML .Read() Цикл
		Если ЧтениеXML .ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда   
			Пока ЧтениеXML .ПрочитатьАтрибут() Цикл
				Если ЧтениеXML .Имя = "id_i" Тогда    
					ИД =  ЧтениеXML .Значение;
				КонецЕсли;          
				Если ИД = ID Тогда
					Если ЧтениеXML .Имя = "id_e" Тогда
						ЧтениеXML .Значение = ГУИД;
					КонецЕсли; 
				КонецЕсли;
			КонецЦикла;
		КонецЕсли;
	КонецЦикла;
Показать


Осталось понять, как записывать...
Про шашлыки шутка - зачет :D
8. karamazoff 118 01.05.23 15:22 Сейчас в теме
(5)В (6) отличный вариант!
9. user1883378 01.05.23 18:48 Сейчас в теме
(7) К сожалению этот вариант не устраивает...
у меня нет файла xml в таком виде
Это по сути своего рода БД из этих xml состоит
Получаю на чтение таким вот образом файл:

ЗапросДолжности = ПолучитьДолжности();
ОбъектXML = СоздатьОбъектXML(ЗапросДолжности);
		
Соединение.GetData(ОбъектXML);

ЧтениеXML = Новый XMLReader;
	ЧтениеXML .SetString(ОбъектXML .xml);
	
	ПостроительДОМ = Новый ПостроительDOM;
	ДокументДОМ	= ПостроительДОМ.Прочитать(ЧтениеXML );
	ЧтениеXML .Закрыть();
	
	ОбходДереваDOM = Новый ОбходДереваDOM(ДокументДОМ);
	ОбходДереваDOM.СледующийУзел();   
	
	УзелDOM = ОбходДереваDOM.СледующийУзел();

	Для каждого Строка Из УзелDOM.ДочерниеУзлы Цикл  
		Для каждого Атрибут Из Строка.Атрибуты Цикл
			Если Атрибут.ИмяУзла = "id_i" И Атрибут.ЗначениеУзла = ID Тогда
				СтрНайдена = Строка.Атрибуты[3];
				СтрНайдена.Значение = Строка(ГУИД); 
				СтрНайдена.ЗначениеУзла = Строка(ГУИД);
				
//Тут должна быть запись текущей строки

			КонецЕсли;	
		КонецЦикла;
	КонецЦикла;
Показать
10. user1883378 01.05.23 18:49 Сейчас в теме
(9) Присваивается значение, но запись не пойму, как сделать
12. user856012 14 01.05.23 19:07 Сейчас в теме
(9)
у меня нет файла xml в таком виде
Ну, как я и подозревал - без шампура тут не обойтись! :-)
13. user1883378 01.05.23 19:17 Сейчас в теме
(4)
(12) Ниже привела код, как я его к этому файлу доступ получаю
его нельзя нигде посмотреть в явном виде
как comобъект хранится или что
он как-то вшит в исходные коды приложения
я не знаю как только, тк доступа у меня к ним нет
15. spacecraft 01.05.23 19:50 Сейчас в теме
(13) нигде он не хранится.
Тупо происходит формирование строки xml формата с:
1. Заголовок xml
2. Элемент "document" и атрибутом "type"

Далее идет обращение к внешнему соединению с передачей этой строки и получением результата.
14. spacecraft 01.05.23 19:38 Сейчас в теме
(9)
у меня нет файла xml в таком виде

ЧтениеXML .SetString(ОбъектXML .xml);

Зато есть уже строка.
ОбъектXML.xml=СтрЗаменить(ОбъектXML.xml,"<атрибут>1234</атрибут>","<атрибут>2345</атрибут>");

:)
starik-2005; +1 Ответить
16. user1883378 01.05.23 21:17 Сейчас в теме
(12)
(14)
ОбъектXML.xml=СтрЗаменить(ОбъектXML.xml,"1234","2345");


Мне кажется, что он по всему файлу пробежится и поменяет, или это не так?
а мне нужно чтобы он заменял, когда значение другого атрибута равно конкретному значению...
18. spacecraft 01.05.23 21:51 Сейчас в теме
(16) условия появляются по мере появлений новых сообщений в теме?
21. user1883378 01.05.23 21:59 Сейчас в теме
(12)
(18) В теме было все написано :)
отвечаю на вопросы, которые возникают)
17. user1883378 01.05.23 21:24 Сейчас в теме
(14)Ваш вариант попробовала - поле объекта недоступно для записи
19. spacecraft 01.05.23 21:52 Сейчас в теме
(17) Так нам отсюда не видно что возвращает метод СоздатьОбъектXML.
22. user1883378 01.05.23 22:01 Сейчас в теме
(19) Прошу )
Спасибо Вам всем за помощь!
Выручаете того, кто ни разу не работал с такими вещами)))

Попытка
		ОбъектXML = Новый COMObject("MSXML2.DOMDocument.3.0");		
		ОбъектXML.loadXML(СтрокаXML);
	Исключение
		ОбъектXML = Неопределено;		
	КонецПопытки;
	
	Возврат ОбъектXML;
24. spacecraft 02.05.23 11:25 Сейчас в теме
(22) это только добавило вопросов.
Что тогда это:
Соединение.GetData(ОбъектXML);

В какой момент нужны изменения и как эти данные используются?
20. user1880116 01.05.23 21:54 Сейчас в теме
(17) У тебя и не получится. Надо учить и понимать технологии и средства их реализации, а не искать волшебную строчку, чтобы скопипастить.

Открываешь xml на чтение и тут же копию на запись. Переносишь в циклах из одного в другое. Если при чтении обнаруживаешь нужное состояние - подправляешь данные, которые пишутся. Потом используешь результат записи

Можно еще xslt преобразование попробовать.
23. user1883378 01.05.23 22:04 Сейчас в теме
(20) Я первый раз столкнулась с таким... Вы тоже поймите, что я хочу учиться, стараюсь и учусь у Вас, умных и опытных специалистов :)
На курсах всего не дают...
Вот и пытаюсь разобраться и понять, как это всё работает) мне таких сложных задач не прилетало ещё)
Все приходит с опытом))
Про xslt не слышала, почитаю) Благодарю Вас!)
25. starik-2005 3088 02.05.23 12:42 Сейчас в теме
(9)
ЧтениеXML .SetString(ОбъектXML .xml);
Ну и что мешает к "ОбъектXML .xml" применить метод из (6)?
11. user1883378 01.05.23 18:52 Сейчас в теме
В процедуре ПолучитьДолжности() происходит следующее:

ЗаписьXML = Новый XMLWriter;
ЗаписьXML .SetString("UTF-8");
ЗаписьXML .WriteXMLDeclaration();
	
ЗаписьXML .WriteStartElement("document");
ЗаписьXML .WriteAttribute("type", "app");
	
ЗаписьXML .WriteEndElement();
	
Возврат ЗаписьXML .Close();
Показать
Оставьте свое сообщение

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