DXL: Почему не срабатывает NotesDXLImporter?

  • Автор темы blackswanny
  • Дата начала

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
У меня было: выгружаю док, потом импортирую его же, - создаётся новый док; выгружаю этот новый док, импортирую, - импортируется, т.е. обновляется! Что за хрень тогда не разобрался, т.к. особо не надо было.. подозреваю, что что-то в обычном доке может быть "лишнее"...
 
30.05.2006
1 345
12
BIT
0
Может ей мешает док in-memory?
Тоже так подумал. Перед импортом делаю delete doc. - те же яйца...


Добавлено:
вот какую-то инфу трогать низя в ДХЛ (удалять), может она и пропала?
Гм...
Задачка-то бытовая: почикать аттачи и картинки из письма.
Т.е. <item name='$FILE'> + из <richtext> выкусить <attachmentref> и просто <picture>. Всё делается на 1-2-3. Кроме импорта.

Если-б знать все folder-ы, где письмо лежит, workaround сделал-бы. Впрочем, и тут засада: как в общем случае найти свежесозданный док-т?
 
T

turumbay

Если-б знать все folder-ы, где письмо лежит, workaround сделал-бы. Впрочем, и тут засада: как в общем случае найти свежесозданный док-т?
workaround: импортировать в отдельно стоящую пустую БД. сразу после импорта получать этот свежий док, писать (скриптом) поверх исходного и убивать
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Задачка-то бытовая: почикать аттачи и картинки из письма.
Т.е. <item name='$FILE'> + из <richtext> выкусить <attachmentref> и просто <picture>. Всё делается на 1-2-3.
Для этого есть совершенно гениальные методы, которые наконец-то стали работать с 8.5.1...:

notesDXLExporter.OmitRichtextAttachments
notesDXLExporter.OmitRichtextPictures
а также:
notesDXLExporter.OmitMiscFileObjects
notesDXLExporter.OmitOLEObjects
 
A

alik86

Колупался с похожей задачкой. Вроде с DXLIMPORTOPTION_REPLACE_ELSE_IGNORE всё ОК работает:
Код:
Sub Click(Source As Button)
Dim Session As New NotesSession
Dim Wsp As New NotesUIWorkspace
Dim db As NotesDatabase
Dim Stream As NotesStream 
Dim DXLImporter As NotesDXLImporter
filename$ = "D:\Картинки\" + Wsp.Prompt(PROMPT_OKCANCELEDIT,_
"Введите имя файла из которого импортировать DXL",_
"D:\Картинки\", "Picture_надо.xml" )
Set Db = Session.CurrentDatabase
Set Stream = Session.CreateStream 
If Not Stream.Open(filename$) Then
Messagebox "Невозможно открыть файл " & filename$,, "Ошибка"
Exit Sub
End If
Set DXLImporter = Session.CreateDXLImporter(stream, Db)
DXLImporter.DocumentImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
DXLImporter.Process
Msgbox "Готово! Документ " & filename$ & " импортирован."
End Sub
В данном примере использован исправленый файл, полученый ранее экспортом дока (Session.CreateDXLExporter(Doc, ...))
P.S. В xml я не силен - я только учусь, так что не ругайте сильно, если чего-то недопонял и не то написал. ;)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
мобуть с этой опией поиграться setForceNoteFormat(false);
 
30.05.2006
1 345
12
BIT
0
:ya_lamo:

Какие очепятки допускают опытные программеры: в уме DocumentImportOption, а в коде - DesignImportOption

Слава Богу, тут просто было.
Воюю дальше - с кодировками: если пром.Stream-ы на файлах, всё Ok. А если "в уме" - не работает. Импортёр ругается на кодировку

Пайпы с ходу не пошли: импортёру не нравится тип Output-а
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Воюю дальше - с кодировками: если пром.Stream-ы на файлах, всё Ok. А если "в уме" - не работает. Импортёр ругается на кодировку
Да, это они отстойно сделали:
Read-only. Character set used by the external data source.

To get: charset$ = notesStream.Charset

Usage
Specify the character set for a stream with Open.
This property is Unicode for a new NotesStream object.
Натыкался на это, когда надо было передавать данные в реляционку, но пока забросил, т.к. чудесным образом кодировка совпала. Да и есть там возможность перекодировки в LCField и LCStream.

Если что-то получится, черкните пожалуйста пару строк...
 
T

turumbay

Воюю дальше - с кодировками: если пром.Stream-ы на файлах, всё Ok. А если "в уме" - не работает. Импортёр ругается на кодировку
Про кодировку: наступал на грабли с кодировкой стримов при использовании xsltransformer-a. Оно ругаеца, если не совпадает кодировка исходного потока, потока c xslt и таргета. Решал принудительной установкой кодировки в UTF-8.
Код:
Function getStreamUTF8() As NotesStream
Dim session As New NotesSession
Dim tmpDoc As New NotesDocument( session.CurrentDatabase )   
Dim stream As NotesStream
Set stream = session.CreateStream
Dim exporter As NotesDXLExporter
Set exporter = session.CreateDXLExporter
Call exporter.SetInput( tmpDoc )
Call exporter.SetOutput( stream )
Call exporter.Process   
Call stream.Truncate
Set getStreamUTF8 = stream
End Function
 
Последнее редактирование модератором:

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
стрим преобразует в кодировку тока при записи на диск
т.е. пори операции open, где можно указать кодировку
но можно не делать open вовсе, один из вариантов указал turumbay

в джава делал преобразование NotesStream в "нормальные" стримы и не юзал устаревшие нотусовые ХМЛ процессоры...

Добавлено: ЗЫ: разумеется имортеры экспортеры заменить нечем :)
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
вот этого в том посте и не хватало ;)
Read-only. Character set used by the external data source.

To get: charset$ = notesStream.Charset

Usage
Specify the character set for a stream with Open.
This property is Unicode for a new NotesStream object.
так что не совсем это workaround
 
T

turumbay

так что не совсем это workaround
Э нет. Это тот самый workaround. unicode != utf-8. Иначе бы не плясал с созданием документа и выгрузки его в in-memory stream и последующим truncate.
Юникод у меня не проканал. Если xmlStream в Unicode , a xslStream в UTF-8 - получаю ошибку в xsltTransformet.transform.
Оно хочет, чтобы все участники процесса конвертации были в одной кодировке.
 
30.05.2006
1 345
12
BIT
0
Вот такой вот workaround был обнаружен: экспортер всегда вываливает результат в utf-8. грех было не воспользоваца. c r6 работает - до сих пор не сломали.
Фиг вам... :) Действительно, поток получает Charset=UTF-8.
НО при первом-же обращении к нему SAXParser-а оно превращается в Charset=x-lnmbcs

Пора рекламацию писать: если поток на файле, то у него Charset=windows-1251, но содержимое - UTF-8. И импортёр его жрёт с удовольствием

Если-же поток in-memory, то Charset=x-lnmbcs (SAX затаптывает и unicode, и принудительный UTF-8). Что при этом в содержимом - х.з.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
НО при первом-же обращении к нему SAXParser-а оно превращается в Charset=x-lnmbcs
...
Если-же поток in-memory, то Charset=x-lnmbcs (SAX затаптывает и unicode, и принудительный UTF-8). Что при этом в содержимом - х.з.
Если это делает агент на сервере, то может ли Charset зависеть от того, что указано в настройках конфигурации сервера?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
466
может перестать мучать LS и перейти на java :)
там не будет нотусовых чарсетов - тока сразу урекать NotesStream и сделать "нормальные" java
и с процессорами там побогаче (можно сторонние подключать), в рамках версии жвм
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
Чтоб не плодить темы.. вопрос: можно каким-то образом не загружать в базу док из XML, а получить объект несохранённого дока по этому XML?
Надо, чтобы юзер щёлкнул на кнопку, ему открылся док (не сохранённый/ по аналогии с новым), а юзер уже сам принимал решение подходит оно ему (сохранять) или нет. Не хочется плодить доки..
 
T

turumbay

Чтоб не плодить темы.. вопрос: можно каким-то образом не загружать в базу док из XML, а получить объект несохранённого дока по этому XML?
Надо, чтобы юзер щёлкнул на кнопку, ему открылся док (не сохранённый/ по аналогии с новым), а юзер уже сам принимал решение подходит оно ему (сохранять) или нет. Не хочется плодить доки..
Импортировать в темповую базу(лучше на локале) и потом new NotesDocument , copyAllItems, ws.EditDocument ?
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
turumbay
Так, собственно, и думал сделать, если вариантов болше не будет.
Хотелось, чтобы Лотус сам чистил окурки; в теории остановился пока на Cache.NDK, а там посмотрим..
 

VladSh

начинающий
Lotus Team
11.12.2009
1 797
158
BIT
232
При импорте выгруженного dxl получил ошибку 4522 "DXL importer operation failed".

В NotesDXLImporter.Log увидел:
<?xml version='1.0'?>
<DXLImporterLog>
<error source='NotesInputSource' line='146' column='3'>Required attribute 'name' was not provided</error>
<error source='NotesInputSource' line='145' column='80' id='6920'>parstyle element must have name attribute</error>
<error>DXL importer operation failed</error>
</DXLImporterLog>
На этой строке был вот такие артефакты:
<pardef id='13' leftmargin='0.0104in' keepwithnext='true' keeptogether='true'><parstyle
/
></pardef>
<pardef id='13' leftmargin='0.0104in' keepwithnext='true' keeptogether='true'><parstyle/></pardef>

Переделал по аналогии с рабочими pardef'ами:
<pardef id='13' leftmargin='0.0104in' keepwithnext='true' keeptogether='true'/>
и всё заработало.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!