|
XML to XML insert | ☑ | ||
---|---|---|---|---|
0
Пиццеед
16.05.18
✎
20:17
|
Хэлло, любители и профессионалы 1с.
Рву волосы из ушей. Есть некий XML_1 и есть фрагмент XML_2 Нужно после некоторого узла из XML_1 вставить фрагмент XML_2. Нужно вставить фрагмент подчиненным элементом <ChildObjects> ВОПРОС: Не соображу как второй ХМЛ сделать узлом первого. Вроде должно быть легко, но дьявол! ЗЫ: В качестве второго бонусного необязательно вопроса не смог понять почему не работает XPath по первому ХМЛ. Пробовал по инструкции отсюда http://catalog.mista.ru/public/146281/ , но что-то не работает поиск ------------ XML_1 ----- <?xml version="1.0" encoding="UTF-8"?> <MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.2"> <Catalog uuid="6a52b08f-60dd-4fef-934e-b4856a174c5a"> <InternalInfo> <xr:GeneratedType name="CatalogObject.Справочник1" category="Object"> <xr:TypeId>d91aba10-78a1-4a9e-a59e-3862101d385d</xr:TypeId> <xr:ValueId>065b3778-9b3f-4bd9-8268-9de794c5409e</xr:ValueId> </xr:GeneratedType> <xr:GeneratedType name="CatalogRef.Справочник1" category="Ref"> <xr:TypeId>914c3a2f-82cc-43ee-a97e-59847cf6b1a9</xr:TypeId> <xr:ValueId>9265df15-2305-4b55-a61b-1a7c09e76aa6</xr:ValueId> </xr:GeneratedType> <xr:GeneratedType name="CatalogSelection.Справочник1" category="Selection"> <xr:TypeId>9b4280c2-1c2c-41df-b99e-1fe0628819f1</xr:TypeId> <xr:ValueId>54720436-1218-46ce-a82b-ed35d5de10b0</xr:ValueId> </xr:GeneratedType> <xr:GeneratedType name="CatalogList.Справочник1" category="List"> <xr:TypeId>b93817a1-9681-406f-bd23-fb6837e15abd</xr:TypeId> <xr:ValueId>c04cf2c4-044a-4ce9-8954-4ec3e697d638</xr:ValueId> </xr:GeneratedType> <xr:GeneratedType name="CatalogManager.Справочник1" category="Manager"> <xr:TypeId>3c4caefe-f213-4eed-9b52-dd7cadb2baa3</xr:TypeId> <xr:ValueId>87d0cc37-ffaf-4fcd-bcbe-f9f8f92b36c4</xr:ValueId> </xr:GeneratedType> </InternalInfo> <Properties> <Name>Справочник1</Name> <Synonym/> <Comment/> <Hierarchical>false</Hierarchical> <HierarchyType>HierarchyFoldersAndItems</HierarchyType> <LimitLevelCount>false</LimitLevelCount> <LevelCount>2</LevelCount> <FoldersOnTop>true</FoldersOnTop> <UseStandardCommands>true</UseStandardCommands> <Owners/> <SubordinationUse>ToItems</SubordinationUse> <CodeLength>9</CodeLength> <DescriptionLength>25</DescriptionLength> <CodeType>String</CodeType> <CodeAllowedLength>Variable</CodeAllowedLength> <CodeSeries>WholeCatalog</CodeSeries> <CheckUnique>true</CheckUnique> <Autonumbering>true</Autonumbering> <DefaultPresentation>AsDescription</DefaultPresentation> <Characteristics/> <PredefinedDataUpdate>Auto</PredefinedDataUpdate> <EditType>InDialog</EditType> <QuickChoice>false</QuickChoice> <ChoiceMode>BothWays</ChoiceMode> <InputByString> <xr:Field>Catalog.Справочник1.StandardAttribute.Description</xr:Field> <xr:Field>Catalog.Справочник1.StandardAttribute.Code</xr:Field> </InputByString> <SearchStringModeOnInputByString>Begin</SearchStringModeOnInputByString> <FullTextSearchOnInputByString>DontUse</FullTextSearchOnInputByString> <ChoiceDataGetModeOnInputByString>Directly</ChoiceDataGetModeOnInputByString> <DefaultObjectForm/> <DefaultFolderForm/> <DefaultListForm/> <DefaultChoiceForm/> <DefaultFolderChoiceForm/> <AuxiliaryObjectForm/> <AuxiliaryFolderForm/> <AuxiliaryListForm/> <AuxiliaryChoiceForm/> <AuxiliaryFolderChoiceForm/> <IncludeHelpInContents>false</IncludeHelpInContents> <BasedOn/> <DataLockFields/> <DataLockControlMode>Managed</DataLockControlMode> <FullTextSearch>Use</FullTextSearch> <ObjectPresentation/> <ExtendedObjectPresentation/> <ListPresentation/> <ExtendedListPresentation/> <Explanation/> <CreateOnInput>Use</CreateOnInput> <ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput> </Properties> <ChildObjects> <Attribute uuid="11bf74fd-4353-4b92-99dc-56f4af4465f3"> <Properties> <Name>Реквизит1</Name> <Synonym/> <Comment/> <Type> <v8:Type>xs:string</v8:Type> <v8:StringQualifiers> <v8:Length>10</v8:Length> <v8:AllowedLength>Variable</v8:AllowedLength> </v8:StringQualifiers> </Type> <PasswordMode>false</PasswordMode> <Format/> <EditFormat/> <ToolTip/> <MarkNegatives>false</MarkNegatives> <Mask/> <MultiLine>false</MultiLine> <ExtendedEdit>false</ExtendedEdit> <MinValue xsi:nil="true"/> <MaxValue xsi:nil="true"/> <FillFromFillingValue>false</FillFromFillingValue> <FillValue xsi:type="xs:string"/> <FillChecking>DontCheck</FillChecking> <ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems> <ChoiceParameterLinks/> <ChoiceParameters/> <QuickChoice>Auto</QuickChoice> <CreateOnInput>Auto</CreateOnInput> <ChoiceForm/> <LinkByType/> <ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput> <Use>ForItem</Use> <Indexing>DontIndex</Indexing> <FullTextSearch>Use</FullTextSearch> </Properties> </Attribute> </ChildObjects> </Catalog> </MetaDataObject> ------------ XML_2 ----- <Attribute uuid="11bf14fd-4353-4b92-99dc-56f4af4465f3"> <Properties> <Name>Реквизит2</Name> <Synonym/> <Comment/> <Type> <v8:Type>xs:string</v8:Type> <v8:StringQualifiers> <v8:Length>10</v8:Length> <v8:AllowedLength>Variable</v8:AllowedLength> </v8:StringQualifiers> </Type> <PasswordMode>false</PasswordMode> <Format/> <EditFormat/> <ToolTip/> <MarkNegatives>false</MarkNegatives> <Mask/> <MultiLine>false</MultiLine> <ExtendedEdit>false</ExtendedEdit> <MinValue xsi:nil="true"/> <MaxValue xsi:nil="true"/> <FillFromFillingValue>false</FillFromFillingValue> <FillValue xsi:type="xs:string"/> <FillChecking>DontCheck</FillChecking> <ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems> <ChoiceParameterLinks/> <ChoiceParameters/> <QuickChoice>Auto</QuickChoice> <CreateOnInput>Auto</CreateOnInput> <ChoiceForm/> <LinkByType/> <ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput> <Use>ForItem</Use> <Indexing>DontIndex</Indexing> <FullTextSearch>Use</FullTextSearch> </Properties> </Attribute> |
|||
1
Defender aka LINN
16.05.18
✎
20:50
|
Ну, вообще это текстовый файл. С ним можно обращаться как с текстовым )
|
|||
2
Пиццеед
16.05.18
✎
23:29
|
(1) Так я так и сделал. Но Хочется красоты через Dom. Но каменный цветок не выходит. :-)
Поэтому надежда на помощь зала и коллективный разум. |
|||
3
big
17.05.18
✎
05:08
|
в общих чертах примерно так, если я правильно понял что нужно
DOMDocument = СоздатьОбъект("MSXML2.DOMDocument"); Партия = DOMDocument.selectSingleNode("//vd:batch"); НоваяПартия = Партия.cloneNode(-1); dom = СоздатьОбъект("MSXML2.DOMDocument"); stockEntry = dom.appendChild(dom.createElement("vd:stockEntry")); stockEntry.appendChild(НоваяПартия); з.ы.: за правильный синтаксис не гарантирую, ибо вырвано из контекста сугубо "по теме" |
|||
4
craxx
17.05.18
✎
05:16
|
(0) Мной написана библиотека в которой XML можно трансформировать в структура, где элементы структуры - это другие структуры и массивы.
Поэтому я вижу это так. 1. Трансформировать оба XML в структуры 2. Вставить вторую структуру в качестве элемента первой структуры. 3. Выгрузить обратно в XML Если интересно, могу выложить себя текст функций |
|||
5
craxx
17.05.18
✎
05:28
|
Собственно, код:
Функция РаспарситьXMLВСтруктуру(Чтение) Экспорт Стек = Новый Массив; СтекИмен = Новый Массив; СтруктураВставки = Неопределено; ИмяВставки=""; ПоследняяОперация = ""; ЗначениеВставки = Неопределено; ПоложитьВСтек(Стек,Новый Структура); Пока Чтение.Прочитать() Цикл Если Чтение.ТипУзла=ТипУзлаXML.НачалоЭлемента Тогда ЧтоВставлять = Новый Структура; Для НН=0 По Чтение.КоличествоАтрибутов()-1 Цикл ЧтоВставлять.Вставить(Чтение.ИмяАтрибута(НН),Чтение.ПолучитьАтрибут(НН)); КонецЦикла; ИмяВставки=Чтение.Имя; КудаВставлять = ДостатьИзСтека(Стек); ПоложитьВСтек(Стек,КудаВставлять); ПоложитьВСтек(Стек,ЧтоВставлять); ПоложитьВСтек(СтекИмен,ИмяВставки); ЗнСв=""; Если КудаВставлять.Свойство(ИмяВставки,ЗнСв) Тогда //уже есть элемент с таким именем, надо добавить как массив Если ТипЗнч(ЗнСв)<>Тип("Массив") Тогда НМасс = Новый Массив; Если ЗнСв<>Неопределено Тогда НМасс.Добавить(ЗнСв); КонецЕсли; НМасс.Добавить(ЧтоВставлять); КудаВставлять.Вставить(ИмяВставки,НМасс); Иначе ЗнСв.Добавить(ЧтоВставлять); КудаВставлять.Вставить(ИмяВставки,ЗнСв); КонецЕсли; Иначе КудаВставлять.Вставить(ИмяВставки,ЧтоВставлять); КонецЕсли; ПоследняяОперация = "НачалоЭлемента"; ИначеЕсли Чтение.ТипУзла=ТипУзлаXML.Текст Тогда Если Стек[Стек.Количество()-1].Количество()=0 Тогда Стек[Стек.Количество()-1]=Чтение.Значение; ПоследняяОперация = "Текст"; Иначе Стек[Стек.Количество()-1].Вставить("_value",Чтение.Значение); КонецЕсли; ИначеЕсли Чтение.ТипУзла=ТипУзлаXML.КонецЭлемента Тогда Имя = ДостатьИзСтека(СтекИмен); Если ПоследняяОперация = "Текст" Тогда ЧтоВставлять = ДостатьИзСтека(Стек); КудаВставлять=ДостатьИзСтека(Стек); КудаВставлять.Вставить(Имя,ЧтоВставлять); ПоложитьВСтек(Стек,КудаВставлять); КонецЕсли; Если ПоследняяОперация="КонецЭлемента" ИЛИ ПоследняяОперация = "КонецКонцаЭлемента" Тогда ПоследняяОперация = "КонецКонцаЭлемента"; ДостатьИзСтека(Стек); ИначеЕсли ПоследняяОперация="Текст" Тогда ПоследняяОперация = "КонецТекста"; Иначе ДостатьИзСтека(Стек); ПоследняяОперация = "КонецЭлемента"; Конецесли; Иначе Продолжить; КонецЕсли; КонецЦикла; Структ=ДостатьИзСтека(Стек); НормализоватьСтруктуру(Структ); Возврат Структ; КонецФункции Процедура НормализоватьСтруктуру(Структ) Для Каждого Киз Из Структ Цикл Если ТипЗнч(Киз.Значение)=Тип("Структура") Тогда Если Киз.Значение.Количество()=0 Тогда Структ.Вставить(Киз.Ключ,""); Иначе НормализоватьСтруктуру(Киз.Значение); КонецЕсли; ИначеЕсли типЗнч(Киз.Значение)=Тип("Массив") Тогда Для Каждого Эл Из Киз.Значение Цикл Если ТипЗнч(Эл)=Тип("Структура") Тогда НормализоватьСтруктуру(Эл); КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ПоложитьВСтек(Стек,Значение) Стек.Добавить(Значение); КонецПроцедуры Функция ДостатьИзСтека(Стек) Если Стек.Количество()=0 Тогда Возврат Неопределено; КонецЕсли; Значение = Стек[Стек.Количество()-1]; Стек.Удалить(Стек.Количество()-1); Возврат Значение; КонецФункции //Процедуры выгрузки // Процедура ВыгрузитьСтруктуруВXML(СтруктураДанных,Запись) Экспорт Для каждого Киз Из СтруктураДанных Цикл Если Киз.Ключ = "XMLАтрибуты" Тогда //Записываем атрибут Для Каждого Атр Из Киз.Значение Цикл Запись.ЗаписатьАтрибут(Атр.Ключ,ПриведенноеЗначение(Атр.Значение)); КонецЦикла; ИначеЕсли Лев(Киз.Ключ,1)="_" Тогда ВыгрузитьСтруктуруВXML(Киз.Значение,Запись); ИначеЕсли Киз.Значение<>Неопределено Тогда Если ТипЗнч(Киз.Значение)=Тип("Строка") Тогда Запись.ЗаписатьНачалоЭлемента(Киз.Ключ); Запись.ЗаписатьТекст(Киз.Значение); Запись.ЗаписатьКонецЭлемента(); ИначеЕсли ТипЗнч(Киз.Значение)=Тип("Булево") Тогда Запись.ЗаписатьНачалоЭлемента(Киз.Ключ); Запись.ЗаписатьТекст(Формат(Киз.Значение,"БЛ=false; БИ=true")); Запись.ЗаписатьКонецЭлемента(); ИначеЕсли ТипЗнч(Киз.Значение)=Тип("Число") Тогда Запись.ЗаписатьНачалоЭлемента(Киз.Ключ); Запись.ЗаписатьТекст(Формат(Киз.Значение,"ЧЦ=14; ЧРД=.; ЧГ=0")); Запись.ЗаписатьКонецЭлемента(); ИначеЕсли ТипЗнч(Киз.Значение)=Тип("Дата") Тогда Запись.ЗаписатьНачалоЭлемента(Киз.Ключ); Запись.ЗаписатьТекст(XMLСтрока(Киз.Значение)); Запись.ЗаписатьКонецЭлемента(); ИначеЕсли ТипЗнч(Киз.Значение)=Тип("Структура") Тогда Запись.ЗаписатьНачалоЭлемента(Киз.Ключ); ВыгрузитьСтруктуруВXML(Киз.Значение,Запись); Запись.ЗаписатьКонецЭлемента(); ИначеЕсли ТипЗнч(Киз.Значение)=Тип("Массив") Тогда ВыгрузитьМассивВXML(Киз.Ключ,Киз.Значение,Запись); ИначеЕсли ТипЗнч(Киз.Значение)=Тип("ТаблицаЗначений") Тогда ВыгрузитьТаблицуЗначенийВXML(Киз.Ключ,Киз.Значение,Запись); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ВыгрузитьМассивВXML(ИмяМассива,МассивДанных,Запись) Для Каждого ЭлементМассива Из МассивДанных Цикл Запись.ЗаписатьНачалоЭлемента(ИмяМассива); Если ТипЗнч(ЭлементМассива)=Тип("Строка") Тогда Запись.ЗаписатьТекст(ЭлементМассива); ИначеЕсли ТипЗнч(ЭлементМассива)=Тип("Булево") Тогда Запись.ЗаписатьТекст(Формат(ЭлементМассива,"БЛ=false; БИ=true")); ИначеЕсли ТипЗнч(ЭлементМассива)=Тип("Число") Тогда Запись.ЗаписатьТекст(Формат(ЭлементМассива,"ЧЦ=14; ЧРД=.")); ИначеЕсли ТипЗнч(ЭлементМассива)=Тип("Дата") Тогда Запись.ЗаписатьТекст(XMLСтрока(ЭлементМассива)); ИначеЕсли ТипЗнч(ЭлементМассива)=Тип("Структура") Тогда ВыгрузитьСтруктуруВXML(ЭлементМассива,Запись); КонецЕсли; Запись.ЗаписатьКонецЭлемента(); КонецЦикла; КонецПроцедуры Процедура ВыгрузитьТаблицуЗначенийВXML(ИмяТаблицы,ТаблицаДанных,Запись) Для Каждого СтрокаТаблицы Из ТаблицаДанных Цикл Запись.ЗаписатьНачалоЭлемента(ИмяТаблицы); Для Каждого КолонкаТаблицы Из ТаблицаДанных.Колонки Цикл Если Прав(КолонкаТаблицы.Имя,1)="_" Тогда Продолжить; КонецЕсли; Структ = Новый Структура(КолонкаТаблицы.Имя,СтрокаТаблицы[КолонкаТаблицы.Имя]); ВыгрузитьСтруктуруВXML(Структ,Запись); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); КонецЦикла; КонецПроцедуры Функция ПриведенноеЗначение(Значение) Если ТИпЗнч(Значение)=Тип("Строка") Тогда Возврат Значение; ИначеЕсли типЗнч(Значение)=Тип("Дата") Тогда Возврат XMLСтрока(Значение); ИначеЕсли ТипЗнч(Значение)=Тип("Число") Тогда Возврат Формат(Значение,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧН=0"); ИначеЕсли ТипЗнч(Значение)=Тип("Булево") Тогда Возврат Формат(Значение,"БЛ=false; БИ=true"); ИначеЕсли ТипЗнч(Значение)=Тип("СправочникСсылка.ОбъектыСтроительства") Тогда Возврат Строка(Значение.УникальныйИдентификатор()); ИначеЕсли ТипЗнч(Значение)=Тип("СправочникСсылка.ВторичныеОбъекты") Тогда Возврат Строка(Значение.УникальныйИдентификатор()); ИначеЕсли Значение=Неопределено Тогда Возврат Неопределено; Иначе Возврат Строка(Значение); КонецЕсли; КонецФункции Функция ВставитьОдинВДругойXML(ИмяФайла1,ИмяФайла2,ИмяВыходногоФайла) Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(ИмяФайла1); Структ1 = РаспарситьXMLВСтруктуру(Чтение); Чтение.Закрыть(); Чтение.ОткрытьФайл(ИмяФайла2); Структ2 = РаспарситьXMLВСтруктуру(Чтение); Чтение.Закрыть(); Структ1.Вставить("ИмяПараметра",Структ2); Запись = Новый ЗаписьXML; Запись.ОткрытьФайл(ИмяВыходногоФайла); ВыгрузитьСтруктуруВXML(СТрукт1,Запись); Запись.Закрыть(); Возврат 0; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |