Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Node в Xml содержащий более 32кб в формате base64 ? / 12 сообщений из 12, страница 1 из 1
09.03.2011, 18:26
    #37156173
Zaour
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Добрый день,

Ситуация :

есть xml файл, с фотографиями закодированными в base64 , каждая фотография хранится в своем node



<tarapmsg:AttachedDocument>
<tarapmsg:AttachedDocument xmlns:s02=" http://www.belvis.be/xsd/v1/TarapDataTypes">
<s02:DocumentNr>00199936eebea03880da000F</s02:DocumentNr>
<s02:DocumentName>Winter</s02:DocumentName>
<s02:DocumentData>/9jV06n1HEx ... Ky0lH0Pmu6h//9k=</s02:DocumentData>
<s02:DocumentType>0001.01</s02:DocumentType>
<s02:DocumentNameExtention>jpg</s02:DocumentNameExtention>
</tarapmsg:AttachedDocument>
<tarapmsg:AttachedDocument xmlns:s02=" http://www.belvis.be/xsd/v1/TarapDataTypes">
<s02:DocumentNr>00199936eebed68730900271</s02:DocumentNr>
<s02:DocumentName>Images</s02:DocumentName>
<s02:DocumentData>yZWYN ... JSVFT0Y=</s02:DocumentData>
<s02:DocumentType>0001.01</s02:DocumentType>
<s02:DocumentNameExtention>pdf</s02:DocumentNameExtention>
</tarapmsg:AttachedDocument>
</tarapmsg:AttachedDocument>

для удобства сократил поле с елементом содержащим фото в base64 (<s02:DocumentData>)

Проблема:

пробовал парсить с помощью TextReadera, елемент разбивается на несколько секций которые потом просто копируются в stream a дальше просто декодирую его c помощью ##class(%SYSTEM.Encryption).Base64Decode(аргумент) и потом пытаюсь просто сохранить в файл, НО

после того как загружаю stream он по длине почему=то в два раза короче чем сами данные в xml файле и на выходе у меня файл содержащий чуть меньше половины фотографии да и к тому же мазайкой

вот сам класс который парсит

ClassMethod getData(PathName As %String) [ SqlName = GetData, SqlProc ]
{
s stream=##class(%Library.GlobalBinaryStream).%New()
s status=##class(%XML.TextReader).ParseFile(PathName,.textreader)
if $$$ISERR(status) do $System.Status.DisplayError(status) quit
while textreader.Read() {
if (textreader.LocalName = "DocumentData") && (textreader.NodeType = "element") {
while (textreader.Read()) && (textreader.NodeType '= "endelement") {
if (textreader.Value'="") && ($l(textreader.Value)>0) {
d stream.Write(textreader.Value)
}
}
d stream.Rewind()
s FileNameSave="C:\tmp\"_Filename_".zzz"
s file=##class(%FileBinaryStream).%New()
s file.Filename=FileNameSave
While 'stream.AtEnd {
set len = 4000
Set line=stream.Read(.len)
if (len>0) {
s lineout=##class(%SYSTEM.Encryption).Base64Decode(line)
d file.Write(lineout)
}
}
d file.%Save()
s Filename = ""
s FileNameSave = ""
s stream = ""
q
}
}
}

Что не так ? какие есть предложения ?
...
Рейтинг: 0 / 0
09.03.2011, 19:10
    #37156242
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
код надо оформлять в тег code,

кто генерирует XML файл, если вы то обрамите Base64 данные в CDATA
еще из них можно по удалять переводы строки
...
Рейтинг: 0 / 0
09.03.2011, 19:27
    #37156264
Zaour
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
DAiMor,

Xml файлы генерируются в COS,

данные записаны одной строкой не содержат переводов строк, проверял в делфи конвертирова обратно и получал файл

а яснее можно про обрамление в сдата ?
...
Рейтинг: 0 / 0
09.03.2011, 20:23
    #37156312
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Zaour,

попробуйте классы %XML.Reader, %XML.Writer, оно того стоит.
Как пример оформления классов можно глянуть тут: http://www.sql.ru/forum/actualthread.aspx?tid=814407
...
Рейтинг: 0 / 0
09.03.2011, 20:24
    #37156313
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Zaourа яснее можно про обрамление в сдата ?
Данные содержащие спецсимволы нужно совать в специальный контейнер

Код: plaintext
<![CDATA[мои_данные]]>
...
Рейтинг: 0 / 0
10.03.2011, 12:12
    #37157170
Zaour
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Блок А.Н.,

пробовал и с %XML.Reader он по моему вообще с нодами содержащими больше 32кб работать не умеет, GetText(.tmp) метод возвращает только стринг.
...
Рейтинг: 0 / 0
10.03.2011, 12:14
    #37157181
Zaour
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
krvsa,

в спец контейнер совать не могу потому что этот xml файл будут читать еще вне Cache, какие еще будут предложения ?
...
Рейтинг: 0 / 0
10.03.2011, 12:48
    #37157301
mys
mys
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Zaour,

CDATA - это не выдумка каше, а используется в XML , следовательно внешний парсер должен о нем знать.
...
Рейтинг: 0 / 0
10.03.2011, 12:51
    #37157312
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Zaourкакие еще будут предложения ?
Таки попробовать с контейнером...
...
Рейтинг: 0 / 0
10.03.2011, 12:51
    #37157314
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
CDATA, это нормально для XML, и если на той стороне нормальный парсер, то он прочитает и с CDATA
для данных более 32 кб, включите поддержку длинных строк, без этой поддержки строки более 32кб обрабатывать нельзя
а Base64Decode работает только со строками
...
Рейтинг: 0 / 0
10.03.2011, 13:05
    #37157360
Блок А.Н.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Еще, если все-таки пихать картинки в строку, то там есть такой параметр MAXLEN, можно попробовать его увеличить.
Ну и поддержку длинных строк наверно нужно включить.
...
Рейтинг: 0 / 0
10.03.2011, 15:43
    #37157817
Zaour
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Node в Xml содержащий более 32кб в формате base64 ?
Спасибо за советы и подсказки,

нашел еще один выход, воспользовался Sax parser-ом , создал свой ContentHanlder указал в нем складывать данные в stream. и включил этот handler в метод ParseFile Sax.parser-a и получил свой stream object содержащий полные данные.

Теперь, как эффективней избавиться от переводов строк и пробелов , на случай если данные base64 все-таки будут содержать их ?
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / Node в Xml содержащий более 32кб в формате base64 ? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]