Имя: Пароль:
1C
 
редактирование существующего файла XML
0 Stilet
 
20.06.11
16:00
Всем привет!
Подскажите коллеги, как проще решить одну задачу.
Есть некий файл XML.
Требуется менять значение тегов и атрибутов, не меняя структуры.
Первым делом я подумал про ТекстовыйДокумент - но уж больно неудобно им редактировать - легко ошибиться при поиске нужного тега.
А ЧтениеXML не подходит из-за того, что им не модифицируешь файл.
Я подумал может ЧтениемXML найти нужный тег и передать номер строки в текстовый документ, чтобы отредактировать, но что то не смог найти такого способа.
Может кто нибудь сталкивался с элегантным и быстрым решением подобной задачи?
1 Ненавижу 1С
 
гуру
20.06.11
16:01
Чтение+Запись не предлагать?
2 Defender aka LINN
 
20.06.11
16:01
Только через текст.
Для удобства/скорости можно регулярные выражения поюзать.
3 Tapo4ek
 
20.06.11
16:02
Делаем чтениеХМЛ, при чтении пишем копию и в процессе модифицируем.
4 Defender aka LINN
 
20.06.11
16:04
(1), (3) Суровые вы :)
5 Stilet
 
20.06.11
16:16
(1) Чтение и запись XML ? Если они позволят быстро и красиво сделать - то почему бы и нет. Я только не понимаю как. ЗаписьХМЛ создает полностью новый файл, стирая содержимое шаблона
6 Stilet
 
20.06.11
16:19
(2) при большом объеме файла (да и теги постоянно повторяются) очень уж геморно... Сейчас подумаю насчет регеспов.. но тоже там куча засад.
например там есть тег id - так его ОЧЕНЬ много везде )
7 Tapo4ek
 
20.06.11
16:19
Сначала писать во временный, потом в конце обработчика первый удалить, второй записать с именем первого. В этом вопрос?
8 Stilet
 
20.06.11
16:20
Хотелось бы встроенными средствами 1С, но вот уже начинаю думать о внешних библиотеках...
9 Stilet
 
20.06.11
16:20
(7) сейчас обдумываю... что то непонятно если честно..
10 Stilet
 
20.06.11
16:21
(7) а откуда этот временный взять? что то непонимаю.
11 Tapo4ek
 
20.06.11
16:23
А елки, че гоню-то, не надо никаких временных, просто в файл с которого читал - туда и пишешь)))
12 Stilet
 
20.06.11
16:28
(11) А как понять в какую строку? Ну нашел я нужный тег в ЧтениеXML... а как понять в какой строке он, чтобы вызвать метод ЗаменитьСтроку(<НомерСтроки>, <Строка>)
13 artbear
 
20.06.11
16:31
(12) Файл большой?
Если не слишком, можно попробовать загрузить в дерево и уже с деревом работать.
14 Stilet
 
20.06.11
16:34
ну гдето до 1 мегабайта.. а так большой достаточно.
15 Stilet
 
20.06.11
16:35
<?xml version="1.0" encoding="UTF-8"?>
<shop xmlns:xlink="http://www.w3.org/1999/xlink">
<category>
   <id></id>
   <id_parent></id_parent>
   <level_depth></level_depth>
   <nb_products_recursive></nb_products_recursive>
   <active></active>
   <name><language id="6"></language></name>
   <link_rewrite><language id="6"></language></link_rewrite>
   <meta_title><language id="6"></language></meta_title>
   <meta_description><language id="6"></language></meta_description>
   <meta_keywords><language id="6"></language></meta_keywords>
   <description><language id="6"></language></description>
<associations>
<categories>
   <category>
   <id></id>
   </category>
</categories>
<products>
   <product>
   <id></id>
   </product>
</products>
</associations>
</category>
</shop>
16 Stilet
 
20.06.11
16:36
небольшой пример вверху. Самое неприятно, что есть несколько тегов <category> , а в них id
17 MM
 
20.06.11
17:08
Посмотри описание модели DOM. ДокументDOM можно прочитать из документа XML,  исправить, а потом записать в документ XML. Недостаток весь файл будет храниться в ОЗУ в процессе обработки.
18 Stilet
 
20.06.11
17:15
(17) спасибо сейчас посмотрю.. Но мне еще одна мысли пришла в голову. Создать ЧтениеXML и ЗаписьXML. Первым читаю теги, а вторым создаю точно такой же файл, только с другим именем на диске и с другими значениями тегов.
19 Stilet
 
20.06.11
17:28
Не. ДокументDOM  это то что нужно. Памяти хватит. Спасибо MM!
20 AaNnDdRrEeYy
 
20.06.11
17:42
как вариант Объект XDTO прочитать в него изменить поля и записать в новый файл, если схема файла есть.
21 Stilet
 
20.06.11
17:46
(20) нет схемы нет.. и получаемый файл может быть разным. Сейчас работаю над ДокументDOM
22 AaNnDdRrEeYy
 
20.06.11
17:50
(21) схема как раз таки и описывает все возможные варианты содержимого файла.
в файле есть простанство имен
<shop xmlns:xlink="http://www.w3.org/1999/xlink">

значит у тех кто этот файл создает схема есть.
23 Stilet
 
20.06.11
18:13
ну вот уже столкнулся с непонятками. Я раньше с этим объектом не работал, поэтому наверняка где то туплю.
написал код простейший:

ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.ОткрытьФайл(ВременныйКаталог+"zap.xml");
   
СтруктураВозврата = ПолучитьПустойШаблонТаблицы("categories");
Если СтруктураВозврата <> Неопределено Тогда
       
       ЧтениеXML = СтруктураВозврата.ЧтениеХМЛ;
       
ПостроительDOM = Новый ПостроительDOM;
ДокументDOM = ПостроительDOM.Прочитать(ЧтениеXML);
       
       
ЗаписьDOM = Новый ЗаписьDOM;
ЗаписьDOM.Записать(ДокументDOM,ЗаписьXML);
//Закрываю запись XML
ЗаписьXML.Закрыть();

результирующий файл отличается от входного. Входной наверху я привел, а результирующий:
ниже брошу для того, чтобы понятнее было
24 Stilet
 
20.06.11
18:13
<?xml version="1.0" encoding="UTF-8"?>
<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
   <category>
       <id/>
       <id_parent/>
       <level_depth/>
       <nb_products_recursive/>
       <active/>
       <name><language id="6"/></name>
       <link_rewrite><language id="6"/></link_rewrite>
       <meta_title><language id="6"/></meta_title>
       <meta_description><language id="6"/></meta_description>
       <meta_keywords><language id="6"/></meta_keywords>
       <description><language id="6"/></description>
       <associations>
           <categories>
               <category>
                   <id/>
               </category>
           </categories>
           <products>
               <product>
                   <id/>
               </product>
           </products>
       </associations>
   </category>
</prestashop>
25 Stilet
 
20.06.11
18:14
нет начала тегов  <id/>, <id_parent/> ,<level_depth/> и т.д
26 Stilet
 
20.06.11
18:14
только окончания. подскажите пожалуйста где моя ошибка - там пару строк кода всего.
27 MM
 
20.06.11
18:25
Элементы <id/>, <id_parent/> ,<level_depth/> просто записались в сокращённой форме, в общем случае парсер, который его будет читать, должен сработать правильно.
28 Stilet
 
20.06.11
18:27
а какие нибудь метода или свойства есть, чтобы в полной форме записалось?
29 MM
 
20.06.11
18:33
Вряд ли. Слеш в конце элемента означает, что внутри элемента пусто, в этом случае начинающий и замыкающий теги объединяются.
Меня в этих документах больше смутило то, что prestashop != shop.
30 Stilet
 
20.06.11
18:37
Я просто другой шаблон взял.. это не страшно )
31 Stilet
 
20.06.11
19:27
Все же 1С такая 1С. Без выбрыконов не может
<id>6</id>
<id_parent>2</id_parent>
<level_depth/>
<nb_products_recursive/>
<active>1</active>
<name>Минеральные масла</name>

записывает не как строка, а как прости меня Господи числа.
Даже наименование пишет без кавычек. Хотя передаю ему именно как строку - <id>6</id> = "6"
Минеральные масла = "Минеральные масла"
Подскажите почему кавычки не ставит?
32 AaNnDdRrEeYy
 
20.06.11
21:01
В строках не должно быть кавычек. до даты доберешся она вообще будет записана как 2011-06-20
33 MM
 
21.06.11
11:19
(31) Почему сразу 1С виновата, DOM-парсер, вроде как, Майкрософтовский, ну или свободный, платформа оболочка над ним. Данные о типе элемента должны храниться схеме XML. А для кавычек в XML выделен спецсимвол &amp , в который парсер сам преобразует кавычки из переданного текста.
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn