|
Добавление в XML новых строк Бычье сердце, trk415e76, okmail, vis, АгентБезопаснойНацио, skafandr, n0ther, fbear, Garykom, Волшебник, PLUT, zenik, panig759, obs191, Кукуев, arsik, Vstur, Silgis, alexxx961503, DemonShinji2, SleepyHead, Stepashkin, alex_kld_2024, d4rkmesa, reg0303, hiddi, N1troZeus, mikecool, mTema32, ndrv, ptiz, 1cVandal, Шаграм, craxx, lubitelxml, Timon1405, nick86, Lama12, Chameleon1980, Шурик71, Михаил Козлов, Bad_Aleks, elka302, runuts, Indian
| ☑ | ||
|---|---|---|---|---|
|
0
Niel_84
31.05.26
✎
11:02
|
Добрый день. Помогите, пожалуйста, разобраться...
Данные = ПолучитьИзВременногоХранилища(Хранилище);
Расширение = ".xml";
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
Данные.Записать(ИмяВременногоФайла);
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяВременногоФайла);
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
ЧтениеXML.Закрыть();
СписокЭлементовDOMФайл = ДокументDOM.ПолучитьЭлементыПоИмени("Файл");
Для Каждого ЭлементDOM Из СписокЭлементовDOMФайл Цикл
Если ЭлементDOM.ЕстьАтрибут("ИдФайл") Тогда
ЭлементDOM.УстановитьАтрибут("ИдФайл",СтрЗаменить((ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("ИдФайл").Значение),"_0_0_0_0_0_00", "_0_1_0_0_0_00"));
КонецЕсли;
КонецЦикла;
СписокЭлементовDOMДопСведТов = ДокументDOM.ПолучитьЭлементыПоИмени("ДопСведТов");
Для Каждого ЭлементDOM Из СписокЭлементовDOMДопСведТов Цикл
Если ЭлементDOM.ЕстьАтрибут("КодТов") Тогда
Атрибут = ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("КодТов").Значение;
GTIN = НайтиGTIN(Атрибут);
ЭлементGTIN = ДокументDOM.СоздатьЭлемент("ИнфПолФХЖ2");
Элемент.УстановитьАтрибут("GTIN", ЭлементGTIN);
//как добавить в существующий файл строку
//<ИнфПолФХЖ2 Идентиф="GTIN" Значен="00000000000000" />
//после <ИнфПолФХЖ2 Идентиф="ID товара" Значен="000000000" />
//то есть должно быть так:
//<ИнфПолФХЖ2 Идентиф="ID товара" Значен="000000000" /
//<ИнфПолФХЖ2 Идентиф="GTIN" Значен="00000000000000" />
KIZ = НайтиKIZ(Атрибут);
Для Каждого Строка Из KIZ Цикл
СписокЭлементовDOMДопСведТов.Добавить(Элемент);
Элемент.УстановитьАтрибут("КИЗ",Строка);
//как в существующим файле изменить строку:
//<ДопСведТов КодТов="00-0000" />
//на ниже следующее(конструкция <ДопСведТов КодТов="00-0000" />
//имеет закрывающий тег /, его нужно убрать и поставить в конце </ДопСведТов>):
//<ДопСведТов КодТов="00-0000">
// <НомСредИдентТов>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// <КИЗ>0000000000000000000000000000000</КИЗ>
// </НомСредИдентТов>
//</ДопСведТов>
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ИмяВременногоФайла, "windows-1251");
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM, ЗаписьXML);
ЗаписьXML.Закрыть();
Заранее всем спасибо. |
|||
|
1
Chameleon1980
31.05.26
✎
11:28
|
ну блин.
что у тебя есть сейчас? ПостроительDOM вернее ДокументDOM потом смотри его методы добавляй и записывай обратно наверное так да голову никто не хочет включать? где код украл? |
|||
|
2
Niel_84
31.05.26
✎
11:59
|
(1) это мой код
например в этом месте СписокЭлементовDOMФайл = ДокументDOM.ПолучитьЭлементыПоИмени("Файл"); Для Каждого ЭлементDOM Из СписокЭлементовDOMФайл Цикл Если ЭлементDOM.ЕстьАтрибут("ИдФайл") Тогда ЭлементDOM.УстановитьАтрибут("ИдФайл",СтрЗаменить((ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("ИдФайл").Значение),"_0_0_0_0_0_00", "_0_1_0_0_0_00")); КонецЕсли; КонецЦикла; получается вторая строка была: Файл xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" стала <Файл xmlns:xsd="http://www.w3.org/2001/XMLSchema" Подскажите, пожалуйста, что не так почему изменилась с xmlns:xsi на xmlns:xsd и обрезало адрес. |
|||
|
3
Niel_84
31.05.26
✎
12:32
|
(2) СписокЭлементовDOMДопСведТов = ДокументDOM.ПолучитьЭлементыПоИмени("ДопСведТов");
Для Каждого ЭлементDOM Из СписокЭлементовDOMДопСведТов Цикл Если ЭлементDOM.ЕстьАтрибут("КодТов") Тогда Атрибут = ЭлементDOM.Атрибуты.ПолучитьИменованныйЭлемент("КодТов").Значение; KIZ = НайтиKIZ(Атрибут); Для Каждого Строка Из KIZ Цикл ЭлементDOM.УстановитьАтрибут("КИЗ",Строка); //в данном случае было: //<ДопСведТов КодТов="00-0000" /> //стало: //<ДопСведТов КодТов="00-0000" КИЗ="0000000000000000000000000000000"/> //а надо: //<ДопСведТов КодТов="00-0000"> // <НомСредИдентТов> // <КИЗ>0000000000000000000000000000000</КИЗ> // <КИЗ>0000000000000000000000000000000</КИЗ> // <КИЗ>0000000000000000000000000000000</КИЗ> // <КИЗ>0000000000000000000000000000000</КИЗ> // </НомСредИдентТов> //</ДопСведТов> КонецЦикла; КонецЕсли; КонецЦикла; |
|||
|
4
Волшебник
31.05.26
✎
18:48
|
Очень много нулей...
|
|||
|
5
Волшебник
31.05.26
✎
18:49
|
очень много комментариев...
|
|||
|
6
Волшебник
31.05.26
✎
18:49
|
Скажите, что Вы хотите от мисты?
|
|||
|
7
Garykom
гуру
31.05.26
✎
18:56
|
СериализаторXDTO вероятно хочет
|
|||
|
8
Волшебник
31.05.26
✎
19:10
|
(7) 👍
|
|||
|
9
mikecool
01.06.26
✎
09:17
|
прочитать в структуру, обработать, записать структуру
|
|||
|
10
Garykom
гуру
01.06.26
✎
10:07
|
(9) Может все же в СписокXDTO?
|
|||
|
11
Жан Пердежон
01.06.26
✎
16:24
|
Помогите разобраться...
<Простыня кода> Заранее всем спасибо Эх, раньше за такую тему ТСу бы дружно в панамку накидали. Стареет миста. |
|||
|
12
mikecool
01.06.26
✎
16:32
|
(10) так и его можно в структуру, да во что угодно ))
|
|||
|
13
Asmody
02.06.26
✎
00:04
|
(11) так можем и накидать:
(0) Яд, стена ![]() сходи разберись для начала чем в XML атрибут отличается от элемента, что такое DOM и что делает ДокументDOM. В самом примитивном случае можно вспомнить, что XML - это просто текст. |
|||
|
14
Garykom
гуру
02.06.26
✎
10:08
|
(13) >В самом примитивном случае можно вспомнить, что XML - это просто текст.
Возможно это самый простейший и быстрейший способ Банально СтрЗаменить для любой (нужной) "строки" на "строка + свои доп.строки" |
|||
|
15
АгентБезопасной Нацио
02.06.26
✎
10:17
|
(14) угу. Что-то решил прикола ради попробовать через XDTO - с типизацией не читает - "структура объекта не соотвествует типу". Без типизации не пишет - тоже типы не совпадают. Ну и сообщения об ошибках, как водится, "ооочень информативные"
|
|||
|
16
Garykom
гуру
02.06.26
✎
10:21
|
(15) Ну правильно это ЧтениеXML + ЗаписьXML делать
С добавлением нужных внутри ЗаписьXML https://infostart.ru/1c/tools/311011/ ЗЫ А через ФабрикаXDTO.ПрочитатьXML() не хочет? Без типизаций, пакетов и схем, я такое использовал и вполне работало для валидных XML Но да только для загрузки, писать затем снова в XML не требовалось |
|||
|
17
АгентБезопасной Нацио
02.06.26
✎
10:51
|
(16) >>А через ФабрикаXDTO.ПрочитатьXML() не хочет?
Хочет, но не может :-) Если просто ФабрикаXDTO.ПрочитатьXML(ЧтениеXML), то читает прекрасно, но тип свойств - anyType, поэтому при добавлении того же НомСредИдентТов, которого создаешь из стандартного пакета -"типы не совпадают". А если пытаюсь прочитать ФабрикаXDTO.ПрочитатьXML(ЧтениеXML, ФайлТип) - "структура объекта не соответствует типу" Для загрузки можно без указания типа. Для модификации уже не канает. Ну и все типы в стандартном пакете ON_NSCHFDOPPR_1_997_01_05_03_01 почему-то не поименованы. >>правильно это ЧтениеXML + ЗаписьXML делать сомнительно. По хорошему, нужно использовать Фабрику и стандартный пакет, чтоб валидировать. Но не работает. |
|||
|
18
vis
02.06.26
✎
11:27
|
XML - это просто текстовый файл.
Можешь обрабатывать его так, как хочешь простыми средствами. |
|||
|
19
Stepashkin
02.06.26
✎
11:30
|
(18) Можно. А зачем?
|
|||
|
20
АгентБезопасной Нацио
02.06.26
✎
13:51
|
В дополнение к (17):
А можно ли как-то понять, что именно не нравится при преобразовании xml в xdto? Понятно, что не нравится свойство Документ. Но что в нем не так? (загружаемый файл проверку формата у диадока - проходит. Вообще, взят из диадока) Читаю так: ЧтениеXML.ОткрытьФайл(Файл); Пакет = ФабрикаXDTO.Пакеты.Получить("ON_NSCHFDOPPR_1_997_01_05_03_01"); СвойствоФайлТип = Пакет.КорневыеСвойства.Получить("Файл").Тип; ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML,СвойствоФайлТип); Ошибка на скрине.
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |