Имя: Пароль:
1C
 
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;
КонецФункции
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший