Удалить узел xml 1с
Метод removeChild() удаляет заданный узел.
Метод removeAttribute() удаляет заданный атрибут.
Удаление узла элемента
Метод removeChild() удаляет заданный узел.
Когда узел удаляется, все его дочерние узлы также удаляются.
Следующий код удалит первый элемент из загруженного XML документа:
- Предположим, что файл books.xml был загружен в переменную xmlDoc
- Сохраняем в переменной "y" узел элемента, который нужно удалить
- Удаляем узел элемента с помощью метода removeChild() из родительского узла
Удалить себя - Удаление текущего узла
Метод removeChild() - единственный способ удалить заданный узел.
Когда вы перешли к узлу, который необходимо удалить, этот узел можно удалить с помощью свойства parentNode и метода removeChild():
- Предположим, что файл books.xml был загружен в переменную xmlDoc
- Сохраняем в переменной "x" узел элемента, который нужно удалить
- Удаляем узел элемента с помощью свойства parentNode и метода removeChild()
Удаление текстового узла
Метод removeChild() также можно использовать для удаления текстового узла:
- Предположим, что файл books.xml был загружен в переменную xmlDoc
- Сохраняем в переменной "x" первый элемент title
- Сохраняем в переменной "y" текстовый узел, который нужно удалить
- Удаляем узел элемента с помощью метода removeChild() из родительского узла
Только для удаления текста из узла метод removeChild() используется довольно редко. Вместо этого можно использовать свойство nodeValue.
Очистка текстового узла
Свойство nodeValue можно использовать для изменения значения текстового узла:
- Предположим, что файл books.xml был загружен в переменную xmlDoc
- Получаем первый дочерний узел первого элемента title
- Используем свойство nodeValue, чтобы очистить текстовое значение текстового узла
Удаление узла атрибута по имени
Метод removeAttribute() удаляет узел атрибута по его имени.
Следующий код удаляет атрибут "category" в первом элементе :
- Предположим, что файл books.xml был загружен в переменную xmlDoc
- При помощи метода getElementsByTagName() получаем список узлов элементов book
- Удаляем атрибут "category" у первого узла элемента book книги.
Удаление узла атрибута через объект
Метод removeAttributeNode() удаляет узел атрибута, используя объект узла в качестве параметра.
Порой при обмене данных получается ситуация когда из удаленного узла необходимо удалить определенные объекты и сделать это непосредственно очень проблематично. Возможные варианты решения такой проблемы рассматриваются в данной статье. Необходимо заметить, что в целом рассматривается ситуация с распределенными информационными базами (РИБ).
Конкретная ситуация: по некоторым причинам необходимо по обмену (а если бы был прямой или удаленный доступ к удаленной базе, то вопрос бы просто отсутствовал) удалить некоторый объект из удаленной базы данных (БД).
Вариант 1. Использование объекта УдалениеОбъекта. Суть – находим ссылку на объект и по обмену посылаем в удаленную базу. Что-то вроде этого:
Узел = ПланыОбмена.ИмяНужногоПланОбмена.НайтиПоКоду("02");
Ссылка=Справочники.Номенклатура.НайтиПоКоду("000000026");
Удаление = Новый УдалениеОбъекта(Ссылка);
Удаление.Записать();
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Удаление);
Но с данным кодом возникнет следующая проблема – при наличии строки Удаление.Записать(); будет удален объект в текущей базе (а это не нужно). При отсутствии строки Удаление.Записать(); в удаленной базе данные останутся, то есть задача не будет решена.
Вот если в текущей БД нет такого объекта , то можно использовать следующее:
Узел = ПланыОбмена.ИмяНужногоПланОбмена.НайтиПоКоду("02");
Ссылка=Справочники.Номенклатура.ПолучитьСсылку(Новый УникальныйИдентификатор("de18c53b-c3a7-11e2-acf9-001966ee0859"));
Удаление = Новый УдалениеОбъекта(Ссылка);
Удаление.Записать();
ПланыОбмена.ЗарегистрироватьИзменения(Узел, Удаление);
Примечание: в 1С8 следует различать УникальныйИдентификатор (UUID) и глобальный уникальный идентификатор (GUID). При необходимости в сети можно найти код преобразования UUID в GUID и обратно.
В итоге получаем, что данный вариант подходит для случаев когда в удаленном узле необходимо удалить объекты, которые отсутсвуют в текущем узле.
Необходимо учесть ситуацию, что в удаленном узле объект присутствует в других объектах (то есть, удалили номенклатуру «Валенки», а этот элемент присутствует в документах удаленного узла). Тут уже надо думать либо о восстановлении элемента в текущей базе либо предусмотреть замену удаляемого элемента на другой элемент.
Но зачастую требуется удалить объект в удаленной БД, но в текущей БД он должен остаться.
Вариант 2. Муторный и не правильный.
Вариант 3. Требуется вносить изменения в конфигуратор.
В модуле плана обмена в обработчике ПриОтправкеДанныхПодчиненному и/или ПриОтправкеДанныхГлавному отлавливаем нужные объекты и для них передаём Удаление.
Например:
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
Если ЭтоНужныйОбъект Тогда
ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить;
КонецЕсли;
КонецПроцедуры
Примечание: для универсальности возможен такой вариант. В план обмена вводим реквизит ВыполняемыйКод, тип строка неограниченной длины. В этот реквизит оперативно вставляется неоходимый программный код. Опять же следует учесть что процедура ПриОтправкеДанныхПодчиненному и ПриОтправкеДанныхГлавному срабатывает для КАЖДОГО отправляемого элемента.
Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента, СозданиеНачальногоОбраза)
Попытка
Выполнить(ВыполняемыйКод);
Исключение
КонецПопытки;
КонецПроцедуры
Вариант 4. Самостоятельно формировать файл XML.
План обмена использую только для регистрации изменений, затем своей обработкой выгружаю выборку в XML по алгоритму из книги Радченко "Практическое пособие разработчика" (довольно просто и гибко получается).
Для передачи удаления объекта не требуется его регистрировать - достаточно выгрузить соответствющую "команду" в XML.
Если Не ВыгружаемыйОбъект.ОтражатьВБухгалтерскомУчете Тогда
. и затем собственно сама выгрузка
А теперь подводные камни.
Если вы желаете удалить некоторый объект, то помните, что на этот объект могут быть завязаны и другие объекты в базе данных. Например – подчиненные справочники, движения документа, независимые регистры сведений и т.д., то есть те объекты которые не имеют смысла при отсутствии удаляемого объекта. Часть объектов можно найти достаточно просто (подчиненные справочники, движения документа, регистры сведений где объект является ведущим измерением), а вот некоторые достаточно проблематично, так как необходимо просматривать каждый объект и смотреть в коде какие изменения он вносит в БД при записи и/или проведении.
И последний совет. Если расхождения в удаленной БД достаточно велики по сравнению с текущей БД, то гораздо быстрее и проще заново создать БД удаленного узла.
В этой небольшой заметке хочу показать Вам, как удалить узел в xml документе с помощью технологии Linq to XML.
И так, для начала создадим и добавим в проект xml файл, который имеет следующую структуру:
Затем добавим строку, которая позволяет при работе с Linq to XML напрямую обращаться к типам, не указывая полных имен.
Удаление xml узла
В качестве первого примера рассмотрим, как удалить последний узел в xml документе.
Сначала с помощью метода Load загружаем xml файл и строим DOM дерево. Затем, с помощью метода Nodes, получаем коллекцию всех xml узлов, кроме корневого узла, которые содержаться в данном xml документе. После чего, используя метод расширения ElementAt, получаем доступ к элементам, полученной ранее коллекции. И с помощью метода Remove удаляем указанный xml узел.
Но, так же мы можем, удалить последний xml узел и, не перебирая и получая все узлы, а сразу же обратившись к нему с помощью свойства LastNode.
Удаление узла с атрибутом
Во втором примере задача остаётся той же, что и в первом примере, но только в данном случаи мы будем удалять узел, зная значение его атрибута. Например, удалим xml узел, который имеет атрибут id со значение три.
В результате будет удалён третий (последний) узел в xml файле.
Удаление дочернего xml узла
Так же очень часто встречается задача, когда необходимо удалить дочерний узел в xml документе. Например, предположим, что нам необходимо удалить в созданном чуть ранее xml файле дочерний узел brothers.
В данном примере сначала находим второй узел, а затем, используя операцию явного приведения и метод Remove, удаляем дочерний xml узел.
Обратиться ко второму узлу мы можем так же и, не используя метод Nodes, а например следующим образом:
Как удалить все узлы в xml файле?
И последний пример, в котором рассмотрим ситуацию, когда необходимо удалить все узлы в xml файле. Для решения данной задачи воспользуемся следующим решением:
В результате будут удалены все узлы в xml документе, кроме корневого узла!
Если же Вам необходимо удалить абсолютно все узлы, то тогда воспользуйтесь следующим способом:
В данной статье, во многих приведенных примерах, используется явное и не явное приведение типа XNode к типу XElement, например:
Такой способ можно использовать только в том случаи, если Вы точно уверены, что все узлы в xml файле имеют тип XElement (элемент). Если же при переборе в цикле мы попадем на другой тип, например комментарий (XComment), то в таком случае произойдет выброс исключения.
Поэтому, если Вам необходимо получить все узлы только типа XElement, то в таком случае лучше всего воспользоваться методом Descendants, например:
Данный метод всегда возвращает только коллекцию элементов, что сразу избавляет нас от выше описанной проблемы.
Следующий пример так же приводит к возникновению исключения при тех же ранее описанных условиях:
Чтобы этого избежать, можно добавить следующую проверку:
На этом всё, если есть какие-то вопросы, то оставляйте их в комментариях.
Удаление узла XML
В общем имеется такой XML <?xml version="1.0" encoding="utf-8"?> <ServerTaskWorkerConfig> <!--.
Удаление узла xml
Как удалить элемент из xml документа?
Добавление и удаление узла в XML
<?xml version="1.0" encoding="utf-8"?> <PassSaver> <profile name="1" pass="2"> .
Удаление узла Xml используя Xpathnavigator
Добрый день. Помогите пожалуйста разобраться в ситуации. Не могу получить доступ к атрибуту узла.
Нет, ничего из этого не помогает.
Здесь происходит смешение Xэлементов и XMLэлементов.
Добавлено через 4 минуты
ture, чем является File в вашем коде?
Sita RaiNy,
Это я просто Вашу xml в файл кинул, загрузил в xmlDOM, выбрал узлы по имени "Заказ" с конкретным фильтром на атрибут. А потом их жахнул в цикле.
ЗЫЖ Ну, у меня кодировка получилась другая.
Metall_Version, да, я знаю про этот способ. Он помогает обойти все, что не "элемент". Но опять же : ничего. И вроде бы Вы уже весь метод описали полностью. Но все равно ничего не происходит. Просто никаких изменений в файле.
Metall_Version, стыдно признаться, но, правда, все пашет.
Дело в том, что у меня переменная содержит следующее значение:
то все находит и удаляет.
Думаю, что дело в переменной. Вернее, в ее способе отделения города.
Если в ТекстБоксе инфа хранится как "Москва (13.10.2013)", то правильно ли я отделяю город?
Добавлено через 1 минуту
Metall_Version, Все, нашла! Пробел лишний был. Не углядела. Большое спасибо за действенный алгоритм!
Решение
нет , там лишний пробел получается
Выбор узла XML по значению другого узла
Работаю с xml. Его структура такова : <data> <item> <id>182</id> <art_url/> .
Значение узла XML
Здравствуйте, есть некий файл XML, который грузится в память. <response list="true">.
Добавление узла в xml
При добавлении нового узла все содержимое файла затирается. XDocument xDoc1=new XDocument(); .
Создание документа XML через LINQ-to-XML
как создать новый документ xml через LINQ-to-xml XDocument doc =new.
В 1С XML используется в основном для обмена информацией с WEB, электронными библиотеками, различными внешними системами для экспорта/импорта данных. XML это текстовые файлы с разметками, которые позволяют хранить данные в уникальном структурированном виде. Могут редактироваться в любом текстовом редакторе.
-< Ресторан Кухня fs10lh1-5">Азиатская " Счет fs10lh1-5">3500 " Категория fs10lh1-5">Высшая " Название fs10lh1-5">Китайская грамота ">
-< Ресторан Кухня fs10lh1-5">Европейская " Счет fs10lh1-5">5000 " Категория fs10lh1-5">Люкс " Название fs10lh1-5">Итальянский Экспресс ">
✔ Чтение файла в формате XML по порядку (способ №1)
//Подходит для файлов более 100Mb
&НаСервере
Процедура ПрочитатьФайлXMLПоПорядкуСпособ1 ( ПутьКФайлу )
XML = Новый ЧтениеXML ;
XML . ОткрытьФайл ( ПутьКФайлу );
Пока XML . Прочитать () Цикл
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Ресторан" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( "Название ресторана:" + Название );
КонецЕсли;
Категория = XML . ЗначениеАтрибута ( "Категория" );
Если Категория <> Неопределено Тогда
Сообщить ( ". наценочная категория ресторана: " + Категория );
КонецЕсли;
Счет = XML . ЗначениеАтрибута ( "Счет" );
Если Счет <> Неопределено Тогда
Сообщить ( ". средний счет ресторана: " + Счет );
КонецЕсли;
Кухня = XML . ЗначениеАтрибута ( "Кухня" );
Если Кухня <> Неопределено Тогда
Сообщить ( ". кухня ресторана: " + Кухня );
КонецЕсли;
Пока XML . Прочитать () Цикл //
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Меню" Тогда
Сообщить ( "Меню:" );
Пока XML . Прочитать () Цикл //
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Блюдо" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( ". название блюда:" + Название );
КонецЕсли;
ИначеЕсли XML . ТипУзла = ТипУзлаXML . КонецЭлемента И XML . Имя = "Меню" Тогда
Прервать;
КонецЕсли;
КонецЦикла; //
ИначеЕсли XML . ТипУзла = ТипУзлаXML . НачалоЭлемента И XML . Имя = "Описание" Тогда
XML . Прочитать ();
Если XML . ТипУзла = ТипУзлаXML . Текст Тогда
Сообщить ( "Описание:" + XML . Значение );
КонецЕсли;
ИначеЕсли XML . ТипУзла = ТипУзлаXML . КонецЭлемента И XML . Имя = "Ресторан" Тогда
//Подходит для файлов более 100Mb
&НаСервере
Процедура ПрочитатьФайлXMLПоПорядкуСпособ2 ( ПутьКФайлу )
XML = Новый ЧтениеXML ;
XML . ОткрытьФайл ( ПутьКФайлу );
СписокИмен = Новый СписокЗначений ;
Пока XML . Прочитать () Цикл
Если XML . ТипУзла = ТипУзлаXML . НачалоЭлемента Тогда
СписокИмен . Добавить ( XML . Имя );
ПутьXML = СобратьПуть ( СписокИмен );
Если ПутьXML = "/Рестораны/Ресторан" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( "Название ресторана: " + Название ); //"Китайская грамота"
КонецЕсли;
Категория = XML . ЗначениеАтрибута ( "Категория" );
Если Категория <> Неопределено Тогда
Сообщить ( ". наценочная категория ресторана: " + Категория ); // Высшая
КонецЕсли;
Счет = XML . ЗначениеАтрибута ( "Счет" );
Если Счет <> Неопределено Тогда
Сообщить ( ". средний счет ресторана: " + Счет ); // 3500
КонецЕсли;
Кухня = XML . ЗначениеАтрибута ( "Кухня" );
Если Кухня <> Неопределено Тогда
Сообщить ( ". кухня ресторана: " + Кухня ); // Азиатская
КонецЕсли;
ИначеЕсли ПутьXML = "/Рестораны/Ресторан/Меню" Тогда
ИначеЕсли ПутьXML = "/Рестораны/Ресторан/Меню/Блюдо" Тогда
Название = XML . ЗначениеАтрибута ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( ". название блюда: " + Название );
КонецЕсли;
ИначеЕсли ПутьXML = "/Рестораны/Ресторан/Описание" Тогда
XML . Прочитать ();
Если XML . ТипУзла = ТипУзлаXML . Текст Тогда
Сообщить ( "Описание: " + XML . Значение );
КонецЕсли;
ИначеЕсли XML . ТипУзла = ТипУзлаXML . КонецЭлемента Тогда
СписокИмен . Удалить ( СписокИмен . Количество () - 1 );
&НаСервере
Функция СобратьПуть ( СписокИмен )
Для Каждого Имя Из СписокИмен Цикл
НашПуть = НашПуть + "/" + Имя ;
КонецЦикла;
//Подходит для файлов менее 100Mb, для больших Не подходит
&НаСервере
Процедура ПрочитатьФайлXMLЧерезDOMСпособ3 ( ПутьКФайлу )
//Поочередная обработка всех узлов документа, представленных в XML:
//1.Объявление механизмов, с помощью которых происходит чтение XML файла; Цикл для обхода узлов;
//2.Считывание данных и атрибутов в узле;
//3.Вывод информации. Если есть необходимость, на этом этапе может происходить запись в переменные или сразу в нужные таблицы;
//4.Завершение работы механизма
ЧтениеXML = Новый ЧтениеXML ;
ЧтениеXML . ОткрытьФайл ( ПутьКФайлу );
Построитель_DOM = Новый ПостроительDOM ;
ДокументXML = Построитель_DOM . Прочитать ( ЧтениеXML );
Для Каждого ТекУзел Из ДокументXML . ЭлементДокумента . ДочерниеУзлы Цикл
Если ТекУзел . ИмяУзла = "Ресторан" Тогда
Название = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( "Название ресторана:" + Название . Значение ); //"Китайская грамота"
КонецЕсли;
Категория = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Категория" );
Если Категория <> Неопределено Тогда
Сообщить ( ". наценочная категория ресторана: " + Категория . Значение ); // Высшая
КонецЕсли;
СрСчет = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Счет" );
Если СрСчет <> Неопределено Тогда
Сообщить ( ". средний счет ресторана: " + СрСчет . Значение ); // 3500
КонецЕсли;
Кухня = Ресторан . Атрибуты . ПолучитьИменованныйЭлемент ( "Кухня" );
Если Кухня <> Неопределено Тогда
Сообщить ( ". кухня ресторана: " + Кухня . Значение ); // Азиатская
КонецЕсли;
Для Каждого ТекУзел1 Из Ресторан . ДочерниеУзлы Цикл
Если ТекУзел1 . ИмяУзла = "Меню" Тогда
Меню = ТекУзел1 ;
Сообщить ( "Меню:" );
Для Каждого ТекУзел2 Из Меню . ДочерниеУзлы Цикл
Если ТекУзел2 . ИмяУзла = "блюдо" Тогда
Блюдо = ТекУзел2 ;
Название = Блюдо . Атрибуты . ПолучитьИменованныйЭлемент ( "Название" );
Если Название <> Неопределено Тогда
Сообщить ( ". название блюда:" + Название . Значение );
КонецЕсли;
ИначеЕсли ТекУзел1 . ИмяУзла = "Описание" Тогда
Сообщить ( "Описание :" + ТекУзел1 . ТекстовоеСодержимое );
&НаКлиенте
Процедура ЗаписатьДанныеВФорматеXML ( ПутьКФайлу )
Рестораны = СоздатьДанныеДляЗаписиВXML ();
ПараметрыЗаписи = Новый ПараметрыЗаписиXML ( "UTF-8" , "1.0" , Ложь); //необязательно их прописовать
XML = Новый ЗаписьXML ;
XML . ОткрытьФайл ( ПутьКФайлу , ПараметрыЗаписи );
XML . ЗаписатьОбъявлениеXML ();
XML . ЗаписатьНачалоЭлемента ( "Рестораны" );
Для Каждого Ресторан Из Рестораны Цикл
XML . ЗаписатьНачалоЭлемента ( "Ресторан" );
XML . ЗаписатьАтрибут ( "Название" , Ресторан . Значение . Название );
XML . ЗаписатьАтрибут ( "Категория" , Ресторан . Значение . Категория );
XML . ЗаписатьАтрибут ( "Счет" , Ресторан . Значение . Счет );
XML . ЗаписатьАтрибут ( "Кухня" , Ресторан . Значение . Кухня );
XML . ЗаписатьНачалоЭлемента ( "Меню" );
Для Каждого БлюдоИзМеню Из Ресторан . Значение . Меню Цикл
XML . ЗаписатьНачалоЭлемента ( "Блюдо" );
XML . ЗаписатьАтрибут ( "Название" , БлюдоИзМеню . Значение . Название );
XML . ЗаписатьКонецЭлемента (); // Блюдо
XML . ЗаписатьКонецЭлемента (); // Меню
XML . ЗаписатьНачалоЭлемента ( "Описание" );
XML . ЗаписатьТекст ( Ресторан . Значение . Описание );
XML . ЗаписатьКонецЭлемента (); // Описание
XML . ЗаписатьКонецЭлемента (); // Ресторан
XML . ЗаписатьКонецЭлемента (); // Рестораны
&НаКлиенте
Функция СоздатьДанныеДляЗаписиВXML ()
Рестораны = Новый СписокЗначений ;
Китайский_ресторан = Новый Структура ( "Название, Категория, Счет, Кухня, Меню, Описание" );
Китайский_ресторан . Название = "Китайская грамота" ;
Китайский_ресторан . Категория = "Высшая" ; //наценочная категория
Китайский_ресторан . Счет = "3500" ; //средний счет
Китайский_ресторан . Кухня = "Азиатская" ;
Китайский_ресторан . Меню = Новый СписокЗначений ;
Китайский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Суши из форели" ));
Китайский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Лапша фирменная" ));
Китайский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Суп из малюсков" ));
Китайский_ресторан . Описание = "Ресторан азиатской кухни Высшей наценочной категории" ;
Рестораны . Добавить ( Китайский_ресторан );
Европейский_ресторан = Новый Структура ( "Название, Категория, Счет, Кухня, Меню, Описание" );
Европейский_ресторан . Название = "Итальянский Экспресс" ;
Европейский_ресторан . Категория = "Люкс" ; //наценочная категория
Европейский_ресторан . Счет = "5000" ; //средний счет
Европейский_ресторан . Кухня = "Европейская" ;
Европейский_ресторан . Меню = Новый СписокЗначений ;
Европейский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Мясная нарезка из мраморной говядины" ));
Европейский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Салат де-люкс Комплимент" ));
Европейский_ресторан . Меню . Добавить (Новый Структура ( "Название" , "Пицца от шеф повара" ));
Европейский_ресторан . Описание = "Ресторан европейской кухни категории Люкс" ;
Рестораны . Добавить ( Европейский_ресторан );
Читайте также: