Имя: Пароль:
1C
1С v8
Редактирование xml 8.3
0 nikname_
 
09.12.15
09:07
Добрый день!Есть вопрос как мне прочитать xml,найти нужные узлы в которых не хватает нужного узла и добавить его.Пробовал через ДокументDOM, бегал циклом по Элементам и добавлял дочерние узлы, но есть одна проблема "Добавляет узел в список дочерних. Если узел с уже присутствует в дереве документа, то он сначала удаляется из прежнего места".Мне не надо что бы он удалялся.
1 nikname_
 
09.12.15
09:08
Что бы ,было понятно что мне нужно получить я выложу xml.
Это у меня есть.
<?xml version="1.0" encoding="UTF-8"?>
<Rights>
    <object>
        <name>DataProcessor.НастройкаРезервногоКопированияИБ</name>
        <right>
            <name>Use</name>
            <value>true</value>
        </right>
    </object>
    <object>
        <name>InformationRegister.АдресныйКлассификатор.Command.АдресныйКлассификатор</name>
        <right>
            <name>View</name>
            <value>true</value>
        </right>
    </object>
    <object>
        <name>DataProcessor.РегламентныеИФоновыеЗадания.Command.РегламентныеИФоновыеЗадания</name>
        <right>
            <name>View</name>
            <value>true</value>
        </right>
    </object>
</Rights>
2 nikname_
 
09.12.15
09:11
Это надо получить:
<?xml version="1.0" encoding="UTF-8"?>
<Rights>
    <object>
        <name>DataProcessor.НастройкаРезервногоКопированияИБ</name>
        <right>
            <name>Use</name>
            <value>true</value>
                        <condition>Текст</condition>
        </right>
    </object>
    <object>
        <name>InformationRegister.АдресныйКлассификатор.Command.АдресныйКлассификатор</name>
        <right>
            <name>View</name>
            <value>true</value>
                        <condition>Текст</condition>
        </right>
    </object>
    <object>
        <name>DataProcessor.РегламентныеИФоновыеЗадания.Command.РегламентныеИФоновыеЗадания</name>
        <right>
            <name>View</name>
            <value>true</value>
                        <condition>Текст</condition>
        </right>
    </object>
</Rights>
3 Мэс33
 
09.12.15
09:24
(0) Пробегать и создавать новый xml?
4 nikname_
 
09.12.15
09:28
Если я использую DOM, то создаю новый XML в конце.
5 Мэс33
 
09.12.15
09:29
Я подумал, что вы в текущем xml пытаетесь сделать изменения.

>>>>"бегал циклом по Элементам и добавлял дочерние узлы"
6 nikname_
 
09.12.15
09:31
Текущий xml я загружаю в память и потом с ним работаю.В конце создаю новый xml и записываю его.
7 nikname_
 
09.12.15
09:33
ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл("C:\Users\MSSIN\Desktop\Role.АдминистраторСистемы.Rights.xml");
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    ЧтениеXML.Закрыть();
8 Мэс33
 
09.12.15
09:33
Тогда код обработки xml - можно взглянуть?
А то смущает --- "обавляет узел в список дочерних. Если узел с уже присутствует в дереве документа, то он сначала удаляется из прежнего места"
9 nikname_
 
09.12.15
09:34
НовыйАтрибут1 = ДокументDOM.СоздатьЭлемент("condition");
10 nikname_
 
09.12.15
09:36
СписокИмен = ДокументDOM.ПолучитьЭлементыПоИмени("right");
                              
    Для каждого Имени из СписокИмен Цикл
    Имени.ДобавитьДочерний(НовыйАтрибут1);
    КонецЦикла;
11 Мэс33
 
09.12.15
09:37
Весь код. Не боись, миста выдержит.
12 Мэс33
 
09.12.15
09:38
(10) ладно, я на обед )))
13 nikname_
 
09.12.15
09:39
)))))Это пример код.В общем я нахожу узел "right" и бегаю по его дочерним узлам, если нахожу узел "condition" то все норм.если нет, то пытаюсь его добавить.
14 nikname_
 
09.12.15
09:39
(12) Есть идеи хоть?
15 Мэс33
 
09.12.15
09:41
(14) Господи, скинь весь код. Зачем гадать.
16 НЕА123
 
09.12.15
09:44
>Мне не надо что бы он удалялся.
его же нет. что удалять-то?
17 nikname_
 
09.12.15
09:45
ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл("C:\Users\MSSIN\Desktop\Role.АдминистраторСистемы.Rights.xml");
    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    ЧтениеXML.Закрыть();


    НовыйАтрибут1 = ДокументDOM.СоздатьЭлемент("condition");
    НовыйТекст = ДокументDOM.СоздатьТекстовыйУзел("ПереносПартийМеждународный ГДЕ ЛОЖЬ");
    НовыйАтрибут1.ДобавитьДочерний(НовыйТекст);
    
    
    ПервыйАтрибут=ДокументDOM.ЭлементДокумента.ПолучитьЭлементыПоИмени("right");    
                                  
    Для каждого Имени из ПервыйАтрибут Цикл
    Если Имени.ПервыйДочерний.ИмяУзла = "name" Тогда//и Имени.ПервыйДочерний.ТекстовоеСодержимое="InformationRegister.АдресныйКлассификатор.Command.АдресныйКлассификатор" и Имени.ПервыйДочерний.СледующийСоседний.ПервыйДочерний.СледующийСоседний.СледующийСоседний = неопределено

    Имени.ДобавитьДочерний(НовыйАтрибут);
    ЗаписьXML.ЗаписатьТекущий(НовыйАтрибут1);
    КонецЕсли;    
    КонецЦикла;
    
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("C:\Users\MSSIN\Desktop\Role.АдминистраторСистемы.Rights1.xml");
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументDOM,ЗаписьXML);
    ЗаписьXML.Закрыть();
18 elCust
 
09.12.15
09:45
(0) Твоя проблема в DOM. Не используй его. Используй ЧтениеXML и ЗаписьXML.
19 nikname_
 
09.12.15
09:46
ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл("C:\Users\MSSIN\Desktop\Role.АдминистраторСистемы.Rights.xml");
    
    ПостроительDOM = Новый ПостроительDOM;
    ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
    ЧтениеXML.Закрыть();


    НовыйАтрибут1 = ДокументDOM.СоздатьЭлемент("condition");
    НовыйТекст = ДокументDOM.СоздатьТекстовыйУзел("ПереносПартийМеждународный ГДЕ ЛОЖЬ");
    НовыйАтрибут1.ДобавитьДочерний(НовыйТекст);
    
    
    ПервыйАтрибут=ДокументDOM.ЭлементДокумента.ПолучитьЭлементыПоИмени("right");    
                                  
    Для каждого Имени из ПервыйАтрибут Цикл
    Если Имени.ПервыйДочерний.ИмяУзла = "name" и Имени.ПервыйДочерний.ТекстовоеСодержимое="InformationRegister.АдресныйКлассификатор.Command.АдресныйКлассификатор" и Имени.ПервыйДочерний.СледующийСоседний.ПервыйДочерний.СледующийСоседний.СледующийСоседний = неопределено Тогда

    Имени.ДобавитьДочерний(НовыйАтрибут);
    ЗаписьXML.ЗаписатьТекущий(НовыйАтрибут1);
    КонецЕсли;    
    КонецЦикла;
    
    
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.ОткрытьФайл("C:\Users\MSSIN\Desktop\Role.АдминистраторСистемы.Rights1.xml");
    ЗаписьDOM = Новый ЗаписьDOM;
    ЗаписьDOM.Записать(ДокументDOM,ЗаписьXML);
    ЗаписьXML.Закрыть();
20 nikname_
 
09.12.15
09:46
(18) Но ведь я не могу в чтении открыть запись??
21 nikname_
 
09.12.15
09:48
ЧтениеXML = Новый ЧтениеXML;
    ЧтениеXML.ОткрытьФайл("C:\Users\MSSIN\Desktop\Role.АдминистраторСистемы.Rights.xml");
    Пока ЧтениеXML.Прочитать() Цикл
        Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
            Если ЧтениеXML.Имя = "right" Тогда
              ????
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
22 nikname_
 
09.12.15
09:50
Подскажите как это сделать, если не сложно?
23 nikname_
 
09.12.15
10:04
(18)На сколько я знаю при записи создается новый xml, а можно ли внести изменение в старый xml, используя этот метод?
24 Мэс33
 
09.12.15
11:16
25 nikname_
 
09.12.15
13:32
Разобрался....спс.