Страница 1 из 1
Edit XML file
Добавлено: 09 Октябрь 2007, 11:39
seawolf
Уважаемые коллеги,
Столкнулся с проблемой: нужно в выгруженный из базы данных из blob XML файл дописать пару строк из программы. На уровне ASCII не получается (похоже автоматом всегда дописывается chr(10) chr(13)) , библиотека IQXML вроде тоже не проходит хотя она хорошо парсит и пишет в новый файл. Кто что посоветует? C6.3 9055
Добавлено: 09 Октябрь 2007, 20:41
Дед Пахом
Даже и не знаю, что посоветовать, чтобы в текстовый файл 2 строки дописать

Добавлено: 10 Октябрь 2007, 8:38
Игорь Столяров
Нет, ну выход есть всегда .... Вопрос в том какой ценой ...
1. Использовать драйвер BASIC, но придется добавлять в пустой файл две строки и далее загонять в него содержимое исходного файла.
2. Можно просто слить два текстовых файла командой вроде RUN('Copy title.txt+old.txt new.txt,1') и т.д. Что не есть красиво.
3. Сделать добавление строк через генерацию и запись VBScript.
Там хороший интерфейс обработки текстовых файлов. Но стоит ли для достаточно простой задачи так изголятся ?
Наверно если подумать, то и еще варианты найдутся.
Добавлено: 10 Октябрь 2007, 9:08
Дед Пахом
Утро вечера мудренее... А чем chr(10) chr(13) помешали? (кстати, наоборот, 0D0A) Я что-то не видел ни одного xml, который бы был без разбивки на строки, и именно по 0D0A (для Windows, естественно)
Re: Edit XML file
Добавлено: 10 Октябрь 2007, 10:23
Admin
seawolf писал(а):Уважаемые коллеги,
Столкнулся с проблемой: нужно в выгруженный из базы данных из blob XML файл дописать пару строк из программы. На уровне ASCII не получается (похоже автоматом всегда дописывается chr(10) chr(13)) , библиотека IQXML вроде тоже не проходит хотя она хорошо парсит и пишет в новый файл. Кто что посоветует? C6.3 9055
Используй драйвер DOS.
Он позволяет сделать именно то что тебе нужно.
Открыл файл. Дописал то что нужно и закрыл.
Добавлено: 10 Октябрь 2007, 10:31
Admin
Вот пример:
Код: Выделить всё
PROGRAM
MAP
END
FileName STRING(255)
BufSize EQUATE(65536)
Tmp FILE,DRIVER('DOS'), NAME(FileName), PRE(Tmp)
Record RECORD
Buff STRING(BufSize)
END
END
CODE
FileName = 'temp.xml'
OPEN(Tmp, 042h)
IF ERRORCODE() THEN MESSAGE(ERROR()) END
Tmp:Buff = 'То что нам нужно добавить без перевода строк!'
ADD(Tmp,LEN(CLIP(Tmp:Buff)))
IF ERRORCODE() THEN MESSAGE(ERROR()) END
CLOSE(Tmp)
IF ERRORCODE() THEN MESSAGE(ERROR()) END
XML
Добавлено: 10 Октябрь 2007, 11:36
seawolf
Спасибо!
Проблема оказалась в том что XML идет UTF-16 и поэтому дописать прямо в лоб строку текста не получалось! Придеться искать средство перевести строку в 16 разрядов. В былые времена это было 5 clarione HEXEDIT demo. В 6 пока не нашел!
Добавлено: 10 Октябрь 2007, 12:15
Admin
Переведи строку в UTF посредством Windows API с спокойно допиши ее в конец файла. Какие проблемы?
API?
Добавлено: 10 Октябрь 2007, 14:58
seawolf
А можно название API функции ?
Добавлено: 10 Октябрь 2007, 15:23
Admin
Может быть народ кинет технологию преобразования ASCII в UTF-16 !?
Я сам такого не делал.
Могу предложить почитать:
http://msdn2.microsoft.com/en-us/library/ms776413.aspx
или погуглить ...
Как вариант - если нужно добавлять всегда одно и тоже в конец файла:
1. Создаешь в редакторе который может править UTF-16 текст который нужно вставить в конец файла.
2. Смотришь коды строки и собираешь из них данные для Кларион, типа var ='<10><13><232><123>' и т.д.
3. Записываешь эту строку в файл
Добавлено: 10 Октябрь 2007, 20:57
Дед Пахом
Завтра придётся xml в UTF-8 или не дай бог Windows-1251 дописывать, и что тогда? Надо юзать какие-либо стандартные средства, а не лисапед изобретать.
Re: API?
Добавлено: 11 Октябрь 2007, 0:04
Admin
seawolf писал(а):А можно название API функции ?
Вот смотри что в ClaList подсказали:
> Как произвести конвертацию подскажет кто нибудь?
> Нужно человеку на форуме:
>
http://forum.clarionlife.net//viewtopic.php?t=1993
По-моему, UTF-16 это просто Unicode
Пусть S - Cstring
Код: Выделить всё
Module('Windows API')
MultiByteToWideChar(Unsigned Codepage,Ulong
dwFlags,ULong LpMultuByteStr, |
Long cbMultiByte, ULong LpWideCharStr,Long
cchWideChar),RAW,Ulong,PASCAL
WideCharToMultiByte(Unsigned Codepage,Ulong
dwFlags,ULong LpWideCharStr,Long cchWideChar, |
ULong lpMultuByteStr, Long cbMultiByte, Ulong
LpDefalutChar,Ulong lpUsedDefalutChar), |
Raw,Ulong,Pascal
End
S Cstring(...) ! Это строка, подлежащая преобразованию
UnicodeText &Cstring
L=Len(S)*2+4 ! Тут с запасом :)
UnicodeText &= New CString(L)
If
MultiByteToWideChar(1251,0,Address(S),-1,Address(UnicodeText),L).
Собственно, UnicodeText и есть то, что надо...
-------------------------
С уважением,
Юрий Философов
OK
Добавлено: 11 Октябрь 2007, 10:44
seawolf
Всем спасибо.
Пока проблему решили дописывая все руками (не так много файлов) и пихая в базу уже готовое и проверенное. Если придеться поюзать эти функции напишу результат !
Добавлено: 14 Ноябрь 2007, 16:25
seawolf
Отвечу сам себе и остальным. Для UTF-16 работает следующая схема (которая уже предлагалась). Строка которую надо туда дописать (в моем случае в начало файла) должна быть модифицирована и между символами требуется вставить <00>. После чего записываем в файл.
Пример:
Имеем строку которую надо записать 'TEST'
Пишем в файл 'T' & <00> & 'E' & <00> & 'S' & <00> & 'T'
Это работает!