Dxl Importer

Тема в разделе "Lotus - Программирование", создана пользователем NickProstoNick, 13 ноя 2009.

  1. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Всем привет!
    Вопрос.
    Вот кусок кода
    <!--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 )
    Но вот никак не пойму как надо
     
  2. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не надо стрима.
    Передавай 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. Мне начинает нравиться новый движок форума.
     
  3. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    так... давай немного подробней...
    тут On Event PostDOMParse From DOMParser Call <DOM_PROCEDURE> я должен сделать вызов своей процедуры?
     
  4. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    В <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]
     
  5. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Тяжело быть бестолковым :)
    Я тебя еще немного по достаю :) больше некого :)

    Т.е. мой код должен выглядеть так?
    <!--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()
    Код (Text):
    <?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...
     
  6. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Да вполне.

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

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

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Угу... ошибка та же :)
     
  8. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    А что ты экпортируешь?
    Простой документ?
    Так не должно быть.
     
  9. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Так... выловил ошибку.

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

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

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

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Если честно, я по классу не подскажу в такой связке.
    Я, по большому счёту, классы вообще не очень люблю.
    Хотя, конечно, использую/пишу иногда.

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

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    По модификации... давай... Я из хелпа по парсеру взял пример обхода дерева....
    Думаю он подойдет
    Мне надо искать определенные сочетания слов и заменять их xml-кодом хотспота
     
  12. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Насколько я помню, задача была что-то вроде в таблице заменить теги на хотспоты.
    Ща гляну, что там було!
     
  13. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Именно именно
     
  14. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Глянул на вскидку:
    Я бы делал примерно так:
    скорее всего взял бы все параграфы по
    <!--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 например :(
     
  15. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Для меня XML вообще темный лес....как для начала - взял процедуру их хелпа... работает... находит то что надо... меняет... а вот только в документе не отображается :(
     
  16. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    ну хз
    Начни с того, что замени текст тага, на, например текщее время.
    Текст тага получить Node.FirstChild.NodeValue если ты на node, которая "par" (как я показывал в примере)
     
  17. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    делаю вот так
    Код (Text):
            Case DOMNODETYPE_TEXT_NODE:       ' Plain text node

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

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Вообще Source.Serialize применяет изменения кагбэ...

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

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

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    Нет... все таки бестолковым быть сложно :(
    Source.Serialize вызывал не в том месте :(
     
  20. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Зороботоло?
     
Загрузка...
Похожие Темы - Dxl Importer
  1. fedotxxl
    Ответов:
    1
    Просмотров:
    3.551
  2. NickProstoNick
    Ответов:
    13
    Просмотров:
    4.354
  3. Lia
    Ответов:
    15
    Просмотров:
    1.080
  4. ty3uk
    Ответов:
    16
    Просмотров:
    1.946
  5. susinmn
    Ответов:
    2
    Просмотров:
    1.128

Поделиться этой страницей