![]() |
![]() |
![]() |
|
Редактирование 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
|
Разобрался....спс.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |