Dxl Importer

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#1
Всем привет!
Вопрос.
Вот кусок кода
<!--shcode--><pre><code class='vb'>Call Me.Exporter.Setinput( doc )
Call Me.Exporter.Setoutput( Me.Stream )
Call Me.Exporter.Process()

Set Me.domParser = Me.session.CreateDOMParser()
Call Me.domParser.Setinput( Me.Stream )
Call Me.domParser.Setoutput( tmpStream )
Me.domParser.Process

Call Me.Importer.Setinput( Me.domParser )
Call Me.Importer.SetOutput( Me.curDb )
Call Me.importer.Process[/CODE]
Ну так вот... документ нормально экспортируется в поток... нормально парсится... но вот импортироваться не хочет.
Лог importer'a
"<?xml version='1.0'?><DXLImporterLog></DXLImporterLog>"

меня смущает вот эта строка Call Me.Importer.Setinput( Me.domParser )
Но вот никак не пойму как надо
 

Omh

Lotus team
04.07.2007
2 210
1
#2
Не надо стрима.
Передавай DXLExporter в DOMParser напрямую.
А DOMParser сразу в DXLImporter.

Вот так:
<!--shcode--><pre><code class='vb'>Dim DXLExporter As NotesDXLExporter
Set DXLExporter = Sess.CreateDXLExporter
Call DXLExporter.SetInput(Doc)

Dim DOMParser As NotesDOMParser
Set DOMParser = Sess.CreateDOMParser
Call DOMParser.SetInput(DXLExporter)
On Event PostDOMParse From DOMParser Call <DOM_PROCEDURE>

Dim DXLImporter As NotesDXLImporter
Set DXLImporter = Sess.CreateDXLImporter
Call DXLImporter.SetInput(DOMParser)
Call DXLImporter.SetOutput(Db)

Call DXLExporter.Process[/CODE]

P.S. Мне начинает нравиться новый движок форума.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#3
так... давай немного подробней...
тут On Event PostDOMParse From DOMParser Call <DOM_PROCEDURE> я должен сделать вызов своей процедуры?
 

Omh

Lotus team
04.07.2007
2 210
1
#4
В <DOM_PROCEDURE> пишется процедура которая модифицирует XML, когда XML оказывается в DOMParser'е
Примерно так:
<!--shcode--><pre><code class='vb'>Private Sub DOM_PROCEDURE(Source As NotesDOMParser)
On Error Goto Errh

Dim RootDoc As NotesDOMDocumentNode
Set RootDoc = Source.Document

'тут идёт обработка

Source.Serialize

Exit Sub
Errh:
Call ErrHandler
Exit Sub
End Sub[/CODE]
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#5
Тяжело быть бестолковым :)
Я тебя еще немного по достаю :) больше некого :)

Т.е. мой код должен выглядеть так?
<!--shcode--><pre><code class='vb'> Call Me.Exporter.Setinput( doc )

Set Me.domParser = Me.session.CreateDOMParser()
Call Me.domParser.Setinput( Me.Exporter )
On Event PostDOMParse From Me.domParser Call DOM_PROCEDURE

Call Me.Importer.Setinput( Me.domParser )
Call Me.Importer.SetOutput( Me.curDb )

Call Me.Exporter.Process()[/CODE]

DOM_PROCEDURE - процедура по твоему примеру...

в итоге ошибка на строке Call Me.Exporter.Process()
Код:
<?xml version='1.0'?><DXLImporterLog><fatalerror source='NotesInputSource' line='1' column='1'>Invalid document structure</fatalerror><fatalerror source='NotesInputSource' line='1' column='1'>The main XML document cannot be empty</fatalerror><err...
 

Omh

Lotus team
04.07.2007
2 210
1
#6
Т.е. мой код должен выглядеть так?
Да вполне.

Думаю проблема в том, что ты в DOMProcudure забыл сериализнуть Source.
Давай для начала без модификаций, а просто напиши такую процедурку:
<!--shcode--><pre><code class='vb'>Private Sub DOM_PROCEDURE(Source As NotesDOMParser)
Source.Serialize
End Sub[/CODE]

И всё, больше ничего.
Тогда по идее, документ должне пройти по кругу DXLExp - DOMPars - DXLImp и вернутся в базу в том же самом виде.

А потом уже посмотрим в сторону модификаций XML на лету.
 

Omh

Lotus team
04.07.2007
2 210
1
#8
А что ты экпортируешь?
Простой документ?
Так не должно быть.
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#9
Так... выловил ошибку.

В общем прикол в чем... вынес процедуру экспорта и процедуру DOM_PROCEDURE из класса - все работает :(
а в классе не хочет :(

Получилось и в классе. Вот только
пришлось вместо On Event PostDOMParse From Me.domParser Call DOM_PROCEDURE написать On Event PostDOMParse From domParser Call DOM_PROCEDURE

Загвостка была в Ме.
Тогда собственно вопрос.... как правильно?
domParser у меня Privat

блин... рано радовался :(
Событие возникает.. но все равно ошибка есть... :(
 

Omh

Lotus team
04.07.2007
2 210
1
#10
Если честно, я по классу не подскажу в такой связке.
Я, по большому счёту, классы вообще не очень люблю.
Хотя, конечно, использую/пишу иногда.

Но в связке класс + DOMParser не подскажу, почему так.

Если есть вопросы по модификации, тут можем поговорить :(
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#11
По модификации... давай... Я из хелпа по парсеру взял пример обхода дерева....
Думаю он подойдет
Мне надо искать определенные сочетания слов и заменять их xml-кодом хотспота
 

Omh

Lotus team
04.07.2007
2 210
1
#12
Насколько я помню, задача была что-то вроде в таблице заменить теги на хотспоты.
Ща гляну, что там було!
 

Omh

Lotus team
04.07.2007
2 210
1
#14
Глянул на вскидку:
Я бы делал примерно так:
скорее всего взял бы все параграфы по
<!--shcode--><pre><code class='vb'>Set NodesList = RootDoc.GetElementsByTagName("par")[/CODE]

Потом иду по этим параграфам
<!--shcode--><pre><code class='vb'>If NodesList.NumberOfEntries > 0 Then
Dim Node As NotesDOMElementNode

Dim i As Integer
For i = 1 To NodesList.NumberOfEntries
Set Node = NodesList.GetItem(i)
If Not Node.IsNull Then
'обработка тут
end if
Next[/CODE]
и проверяю находится ли он в ячейке (<!--shcode--><pre><code class='vb'>Node.ParentNode.NodeName = "tablecell"[/CODE])
и есть ли в ней таг, который надо заменять (<!--shcode--><pre><code class='vb'>Instr(Node.FirstChild.NodeValue, "TAG") <> 0[/CODE])

Если есть, то на его месте строил бы сктрутуру hotspota:
<!--shcode--><pre><code class='xml'><doclink document='FAF5C35113AF1081C225761D004283F2' database='C225737800338EDF' description='Hole' server='ZHOPS'/>[/CODE]
А текст бы випиливал.


Как-то так.

Ничё невозможного, но повозится надо.

Вполне возможно, что это не самый оптимальный алгоритм, просто пришёл в голову первым :(
Можно иди по tablecell например :(
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#15
Для меня XML вообще темный лес....как для начала - взял процедуру их хелпа... работает... находит то что надо... меняет... а вот только в документе не отображается :(
 

Omh

Lotus team
04.07.2007
2 210
1
#16
ну хз
Начни с того, что замени текст тага, на, например текщее время.
Текст тага получить Node.FirstChild.NodeValue если ты на node, которая "par" (как я показывал в примере)
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#17
делаю вот так
Код:
		Case DOMNODETYPE_TEXT_NODE:		  ' Plain text node

If node.NodeValue = "TECT" Then
node.NodeValue = "РАБОТАЕТ!"
End If
но вот нет изменений... хотя условие отрабатывает.
Может как-то надо обновлять парсер... или импортер... или хз что :(
 

Omh

Lotus team
04.07.2007
2 210
1
#18
Вообще Source.Serialize применяет изменения кагбэ...

А тут мне кажется, что текущую Node надо выпилить, а к её паренту приделать новую:
<!--shcode--><pre><code class='vb'>Dim TextNode As NotesDOMTextNode
Set TextNode = RootDoc.CreateTextNode(ChdValue)
Call ParentNode.AppendChild(TextNode)[/CODE]

Хотя может можно и просто сменить NodeValue, не уверен
 

NickProstoNick

Статус как статус :)
Lotus team
22.08.2008
1 809
21
#19
Нет... все таки бестолковым быть сложно :(
Source.Serialize вызывал не в том месте :(