1

Тема: Агент получения файлв с FTP и парсинга их NotesSAXParser

Данный агент берет все XML файлы с папочки FTP/Finali, переносит в их lotus-доки в вид Inbox спец базы.
Так же все XML распарсиваю с помощью класса NotesSAXParser и новый документ получаю значения нужных мне тегов.

Опции:
Option Public
Use "NotesFTP"

Декларации:

Public  pFlag As String
Public  PNod1 As String 
Public  PNod2 As String 
Public  PNod3 As String 
Public doc As NotesDocument

Initialize

Sub Initialize
    On Error Goto ErrH
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.CurrentDatabase
    'Dim doc As NotesDocument
    Dim rtitem As NotesRichTextItem
    Dim object As NotesEmbeddedObject
    
    Dim domParser As NotesDOMParser
    Dim docNode As NotesDOMDocumentNode
    Dim  docrootnode As NotesDOMDocumentNode
    Dim strm As NotesStream    
    Dim  outputStream As NotesStream
    Set outputStream =session.CreateStream()
    Set strm = session.CreateStream() 
    
    Dim ftpIP As String
    Dim ftplogin As String
    Dim ftpPass As String
    'Dim datapatch As String
    
    Dim view_conf As NotesView
    Dim doc_conf As NotesDocument
    
    'получить данные для доступа к FTP
    Set db = session.CurrentDatabase
    Set view_conf=db.GetView("Config")
    
    Set doc_conf=view_conf.GetFirstDocument
    If doc_conf.SFTPIP(0) = "" Then Print("Поле ftpIP сервера пустое, проверьте настройки !") :  Exit Sub
    If doc_conf.SFTPLogin(0) = "" Then Print("Поле ftpLogin пустое, проверьте настройки !") :  Exit Sub
    If doc_conf.SFTPPassword(0) = "" Then Print("Поле ftpPassword пустое, проверьте настройки !") :  Exit Sub
    If doc_conf.STmpDataPath(0) = "" Then Print("Поле папка tmp-mejved пустое, проверьте настройки !") :  Exit Sub
    
    
    ftpIP =doc_conf.SFTPIP(0)
    ftpLogin=doc_conf.SFTPLogin(0)
    ftpPass=doc_conf.SFTPPassword(0)    
    datapatch$=doc_conf.STmpDataPath(0)
    
    
    Print "Агент FTP IN Стартовл!"
    Dim objFTP As NotesFTPSession
    Set objFTP=New NotesFTPSession
    
    'datapatch$ = "C:\Tmp-mejved\" 
    
    With objFTP
        .Connect ftpIP, ftpLogin, ftpPass, 0  '  НАДО получить возвращаемое значение - если ошибка!
        If objFTP.IsConnected =  True  Then
        '.ChangeDirectory("Finali")
            Dim xxx As Variant
            xxx = .dir("Finali")
            
            If Isempty(xxx) Then        
                Print "Папка Finali пустая!"
                Exit Sub
            Else
                Print "В папке Finali файлы:"
                Forall v In xxx
                    Print v    
                End Forall
                Print   "----старт--------"
                
                Forall v In xxx
                    If Instr(v,"xml") Then             
                        Print "v=" & v
                        remoteFile$ = "Finali/"& v
                        localFile$ = datapatch$ & v
                        .GetFile remoteFile$, localFile$, FTP_TRANSFER_TYPE_BINARY    
                        Print "скопировали на винт"
                        ' проверка файла на винте
                        Sleep (2)
                        FName = Dir$(datapatch$ & {*.*}, 0) 
                        Print "проверка, что файл в папке на винте - старт"
                        While FName <> ""
                            Print "FName=" & FName
                            If FName = v Then
                                Print  "Файл на винте ЕСТЬ - "  & localFile$
                            End If
                            FName = Dir$() 
                        Wend
                        FName =""
                        Sleep (1)
                        Print "проверка создания файла на винте - енд"
                ' создаем новый док в базе и прикрепляем к нему xml файл
                        
                        Set doc = New NotesDocument(db)
                        doc.Form="fmejved"
                        doc.ТИП_ДОКУМЕНТА="Входящий"
                        doc.fxml="1"
                        doc.АДРЕСАТ = ""  ' надо создать поле
                        Set rtitem = New NotesRichTextItem( doc, "ПРИЛОЖЕНИЯ_" )
                        Set object = rtitem.EmbedObject  (EMBED_ATTACHMENT, "", localFile$)
                        Call strm.Open(localFile$, "UTF-8" )
                        
                        ' -------------- SAX
                        pFlag = "0"         ' паблик элемент xml дерева, в котором распарсевыемые теги
                        PNod1 = "0"  ' паблик элемент xml дерева, в котором теги уровня 1.
                        PNod2 = "0"  ' 2-й уровень вложенности
                        PNod3 = "0" 
                        Print "Старт NotesSAXParser"
                        Dim saxParser As NotesSAXParser
                        Set saxParser=session.CreateSAXParser(strm, outputStream)
                        On Event SAX_Characters From saxParser Call SAXCharacters ' содержимое элемента
                        On Event SAX_StartElement  From saxParser Call SAXStartElement 'старт элемента
                        saxParser.Process
                        Print "Конец NotesSAXParser"
                        
                        
                        Call doc.Save(True, True)
                        Print "doc.Save"
ForNextXML:    
                        Call strm.Close
                        'Print localFile$ + " запишем в temp.bat - удалить xml-ку"
                        fileNum% = Freefile()
                        Open datapatch$ + "temp.bat" For Append As fileNum%
                        Print # fileNum%, "del " localFile$
                        Close  fileNum%
                        .DeleteFile  remoteFile$ '  стерли на фтп
                    'Print  "--+++-- Файл на ФТП стерт  " + remoteFile$
                    End If
                End Forall
            End If    
            .Disconnect
        End If    
    End With
    
    Sleep (2) '   запуск temp.bat для удаления всех xml
    deletefile% = Shell (datapatch$ + "temp.bat" ,1)   '  вернуло 33 - всё ок.
    Print  "Файлы xml на винте стерты"
    Sleep (2)
    Kill datapatch$ + "temp.bat"
    
    Delete objFTP    
    Print "Агент FTP IN отработал!"
    Exit Sub
ErrH:
    Print "FTP IN - Агент - Ошибка: " & Err & " - " & Error(Err) & " в строке " & Erl
    If Err = 4602  Then
        Print "Отработали ошибку 4602 - не отработал domParser.Process"
        Resume ForNextXML
    End If
'    
End Sub

SAXCharacters

Sub SAXCharacters (Source As Notessaxparser, Byval Characters As String, Count As Long)
    
    If pFlag = "nameru" Then
        Print " nameru текст "  Characters
        doc.ОСНОВНОЙ_КОРРЕСПОНДЕНТ = Characters
        pFlag = "0"
    End If
    
    If pFlag = "header" And PNod1 = "container" Then
        Print " header текст " Characters
        doc.ЗАГОЛОВОК     = Characters
        pFlag = "0"
    End If
    
    If pFlag = "post" And PNod3 = "legalentity" Then
        Print " post текст " Characters
        doc.АДРЕСАТ  = Characters
        pFlag = "0"
    End If
    
    If pFlag = "datareg" And PNod2 = "reg" Then
        Print " datareg текст " Characters
        doc.ДАТА_ОСНОВНОГО_КОРРЕСПОНДЕНТА =  Characters
        pFlag = "0"
    End If
    
    If pFlag = "regnumber" And PNod2 = "reg" Then
        Print " regnumber текст " Characters
        doc.РЕГ_НОМ_ОСНОВНОГО_КОРРЕСПОНДЕНТА = Characters
        pFlag = "0"
    End If
    
    If pFlag = "vhodregdate" And PNod2 = "reg" Then
        Print " vhodregdate текст " Characters
        pFlag = "0"
    End If
    
    If pFlag = "vhodregnumber" And PNod2 = "reg" Then
        Print " vhodregnumber текст " Characters
        pFlag = "0"
    End If
    
    If pFlag = "executorname" And PNod2 = "executor" Then
        Print " executorname текст " Characters
        pFlag = "0"
    End If
    
    If pFlag = "idgosuslug" And PNod2 = "servinfo" Then
        Print " idgosuslug текст " Characters
        pFlag = "0"
    End If
End Sub

SAXStartElement

Sub SAXStartElement (Source As Notessaxparser, Byval elementname As String, Attributes As NotesSaxAttributeList)
    Dim i As Integer
    
    If elementname = "container" Then
        PNod1 = "container"
        Print "<container>"
    End If
    If elementname = "servinfo" Then
        PNod1 = "servinfo"
        Print "<servinfo>"
    End If
    If elementname = "destinations" Then
        PNod2 = "destinations"
        Print "<destinations>"
    End If
    If elementname = "reg" Then
        PNod2 = "reg"
        Print "<reg>"
    End If
    If elementname = "executor" Then
        PNod2 = "executor"
        Print "<executor>"
    End If
    If elementname = "legalentity" Then
        PNod3 = "legalentity"
        Print "<legalentity>"
    End If
    ' -----------------------------------------------------------    
    If elementname="nameru" Then   '  container / nameru
        pFlag = "nameru" 
        Print " <nameru>"
        Print "PNod1 =  "  PNod1
    End If
    If elementname="header" Then   ' container / header
        'And fParentNode = "container" 
        pFlag = "header" 
        Print "<header>"
        Print "PNod1 =  "  PNod1
    End If
    
    If elementname="post" Then '    container/destinations/destination/legalentity/post
        pFlag = "post" 
        Print "<post>"
        Print "PNod3 =  "  PNod3
    End If
    If elementname="datareg" Then 'container / reg / datareg
        pFlag = "datareg" 
        Print "<datareg>"
        Print "PNod2 =  "  PNod2
    End If    
    If elementname="regnumber" Then 'container / reg / regnumber
        pFlag = "regnumber" 
        Print "<regnumber>"
        Print "PNod2 =  "  PNod2
    End If    
    If elementname="vhodregdate" Then ''container / reg / vhodregdate
        pFlag = "vhodregdate" 
        Print "<vhodregdate>"
        Print "PNod2 =  "  PNod2
    End If    
    If elementname="vhodregnumber" Then 'container / reg /  vhodregnumber
        pFlag = "vhodregnumber" 
        Print "<vhodregnumber>"
        Print "PNod2 =  "  PNod2
    End If    
    If elementname="executorname" Then ''container /  executor / executorname
        pFlag = "executorname" 
        Print "<executorname>"
        Print "PNod2 =  "  PNod2
    End If    
    If elementname="idgosuslug" Then 'servinfo / idgosuslug
        pFlag = "idgosuslug" 
        Print "<idgosuslug>"
        Print "PNod1 =  "  PNod1
    End If    
    
End Sub

Поделиться

2

Re: Агент получения файлв с FTP и парсинга их NotesSAXParser

А теперь сравниваем работу SAX и DOM парсеров.


Сервер1.

Агенты по расписанию:
100 мб - SAX и  DOM парсеры выдают ошибку на метод Process.
70мб - SAX парсит, DOM  - ошибка.

Кнопка
100мб - SAX и  DOM парсеры отрабатывают корректно.


Сервер2.

Агенты по расписанию:
100 мб - SAX парсер  отрбаотал ОК.
100 мб -   DOM парсер отрбаотал ОК.

Поделиться

3

Re: Агент получения файлв с FTP и парсинга их NotesSAXParser

На сервере 1
\Program Files\Lotus\Domino\notes.ini   удаляю
HTTPJVMMaxHeapSize=364M
HTTPJVMMaxHeapSizeSet=1

И при 100 МБ XML парсер на SAX работает, а на DOM - нет!

Поделиться