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