Xml

Тема в разделе "Lotus - Программирование", создана пользователем deeeman, 17 апр 2008.

  1. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    столкнулся с проблемой создания XML цивильным образом,


    зная что в XML элемент дизайна выглядит так:


    <form name="название формы" publicaccess="false" designerversion="6.5">
    <actionbar bgcolor="#d4d0c8" bordercolor="black">
    <action title="кнопка"></action>
    </actionbar>
    <body>
    <richtext>
    <field type="text" kind="editable" name="новое поле" />
    </richtext>
    </body>
    </form>




    попробовать организовать создание XML файла не простыми принтами в файл,
    а используя метод в агенте LS (только какой я не в курсе)

    а потом импортировать в лотусовую базу. Получим форму в БД
     
  2. Sandr

    Sandr Гость

    deeeman
    Геморно это... очень много грабьлей есть, на которые все наступают... Купите у Omha готовый механизм :D
     
  3. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не надо у меня ничё покупать, я так отдам :D

    Вот небольшой агентик, который генерит простенький XML для агента, готовый уже к импорту в базу.
    Это я набросал себе, что бы проверить, как с нуля нормальными классами создать дизайн элемент.
    С остальными агентами/дизайн элементам примерно также.

    [codebox]Option Public
    Option Declare
    Private AgentName As String

    Sub Initialize
    On Error Goto Errh

    AgentName = Inputbox$("Agent name", "Enter agent name", Format$(Now, "hhmmss"))
    If AgentName = "" Then Exit Sub

    Dim Sess As New NotesSession

    Dim Agent As NotesAgent
    Set Agent = Sess.CurrentAgent

    Dim Db As NotesDatabase
    Set Db = Agent.Parent

    Dim outputFile As String
    outputFile = "c:\result.xml"

    Dim outputStream As NotesStream
    Set outputStream = sess.CreateStream
    Call outputStream.Open(outputFile)
    Call outputStream.Truncate

    Dim XMLRoot As String
    XMLRoot = "<database></database>"

    Dim DOMParser As NotesDOMParser
    Set DOMParser = Sess.CreateDOMParser(XMLRoot, outputStream)

    On Event PostDOMParse From DOMParser Call ProcessDOM
    DOMParser.Process

    Exit Sub
    Errh:
    'Call ErrHandler
    Exit Sub
    End Sub

    Private Sub ProcessDOM(Source As NotesDOMParser)
    On Error Goto Errh

    Dim RootDoc As NotesDOMDocumentNode
    Set RootDoc = Source.Document

    Dim DatabaseNode As NotesDOMElementNode
    Set DatabaseNode = RootDoc.DocumentElement
    Call SetDatabaseAttributes(DatabaseNode)

    Dim AgentNode As NotesDOMElementNode
    Set AgentNode = RootDoc.CreateElementNode("agent")
    Set AgentNode = DatabaseNode.AppendChild(AgentNode)
    Call SetAgentAttributes(AgentNode)

    Dim TriggerNode As NotesDOMElementNode
    Set TriggerNode = RootDoc.CreateElementNode("trigger")
    Set TriggerNode = AgentNode.AppendChild(TriggerNode)
    Call SetTriggerAttributes(TriggerNode)

    Source.Serialize

    Exit Sub
    Errh:
    'Call ErrHandler
    Exit Sub
    End Sub

    Sub SetDatabaseAttributes(Node As NotesDOMElementNode)
    On Error Goto Errh

    Call Node.SetAttribute("version", "6.5")

    Exit Sub
    Errh:
    'Call ErrHandler
    Exit Sub
    End Sub

    Sub SetAgentAttributes(Node As NotesDOMElementNode)
    On Error Goto Errh

    Call Node.SetAttribute("name", AgentName)

    Exit Sub
    Errh:
    'Call ErrHandler
    Exit Sub
    End Sub

    Sub SetTriggerAttributes(Node As NotesDOMElementNode)
    On Error Goto Errh

    Call Node.SetAttribute("type", "agentlist")

    Exit Sub
    Errh:
    'Call ErrHandler
    Exit Sub
    End Sub[/codebox]
     
  4. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    я счастлив за эти строчки)))

    Код (Text):
        Dim DatabaseNode As NotesDOMElementNode
    Set DatabaseNode = RootDoc.DocumentElement
    Call SetDatabaseAttributes(DatabaseNode)

    Dim AgentNode As NotesDOMElementNode
    Set AgentNode = RootDoc.CreateElementNode("agent")
    Set AgentNode = DatabaseNode.AppendChild(AgentNode)
    Call SetAgentAttributes(AgentNode)
    Всем респект, отдельное спасибо Omh


    а вообще я пишу прогу на LS которая из Rational Rose выгружает классы(со всеми их атрибутами) и создает их в Notes базе.
    чтобы мароки меньше было при создании дизайна в начале разработки проекта


    Вообще что нибудь слышали по этому поводу?
    Знаю что это не ново для C++ Java Oracle ...
     
  5. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    Не, тут я не в теме.
    Слова Rational Rose забыл, как только окончил универ или даже чуть раньше :D
     
  6. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    на самом деле зря забыл)

    очень хорошая среда для проектирования системы...

    не знаю как обходятся вообще без проектирования проектов, но с моделями классов очень удобно.


    а вообще Лотусовые системы проектируют только в голове???
    или все таки есть функционал специальный?
     
  7. Sandr

    Sandr Гость

    для RR есть афигительный фреймворк для лотуса... в стандлартны й пакет он не входит, но если поискать, то можно и найти.. в крайнем случае самому написать :)
     
  8. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    вот самому и приходится писать)))))
    а найти не удавалось.

    ОРшибка у меня с XML:

    создал XML файл агентом который выше:

    <database title='175520' version='6.5'>
    <form name='175520' alias='175520' comment='12345'>
    <actionbar bgcolor='#d4d0c8' bordercolor='black'>
    <action title='название кнопки'/>
    </actionbar>
    </form>
    </database>

    он не хотит залазить в БД XMLImporterom. Где ошибка?


    [codebox]Sub Initialize
    On Error Goto processerror
    Dim session As New NotesSession
    Dim db As NotesDatabase
    Set db = session.CurrentDatabase
    filename$ = "result"

    REM Open xml file named after current database
    Dim stream As NotesStream
    Set stream = session.CreateStream
    If Not stream.Open("c:\" & filename$ + ".xml") Then
    Messagebox "Cannot open " & filename$,, "Error"
    Exit Sub
    End If

    If stream.Bytes = 0 Then
    Messagebox "File did not exist or was empty",, filename$
    Exit Sub
    End If

    REM Create new database named after current database
    Dim dbCopy As NotesDatabase
    Set dbCopy = New NotesDatabase("", "c:\" + filename$ + ".nsf")
    Call dbCopy.Create("", "", True)

    REM Import DXL into new database
    Dim importer As NotesDXLImporter
    Set importer = session.CreateDXLImporter(stream, dbCopy)
    Call importer.SetInput(stream)
    Call importer.SetOutput(dbCopy)

    importer.ReplaceDBProperties = True
    importer.ReplicaRequiredForReplaceOrUpdate = False
    importer.ACLImportOption = DXLIMPORTOPTION_REPLACE_ELSE_IGNORE
    importer.DesignImportOption = DXLIMPORTOPTION_CREATE

    Call importer.Process

    Call dbCopy.Sign(DBSIGN_DOC_DATA)
    closeReport:
    Exit Sub
    processerror:
    Msgbox Error & " in importXML Agent at line " & Erl
    Resume closeReport
    End Sub[/codebox]
     
  9. Omh

    Omh Lotus team
    Lotus team

    Регистрация:
    4 июл 2007
    Сообщения:
    2.210
    Симпатии:
    0
    deeeman
    Выпечатай NotesDXLImporter.Log - станет понятнее.

    Вообще ошибка такая:
    <error source='NotesInputSource' line='2' column='2' id='6924'>form element must contain body element</error>
    <error>DXL importer operation failed</error>

    Короче, направильно стркутуры формы сгенерил.

    Что бы не писать агентов, можешь взять мою тулузу и экспортить/импортить ей.
     
  10. Sandr

    Sandr Гость

    а чем кроет? в какой строчке ошибка не говорит?
     
  11. deeeman

    deeeman Well-Known Member

    Регистрация:
    4 дек 2007
    Сообщения:
    382
    Симпатии:
    0
    выяснилось что базу надо создавать с дефолтовой вьюхой, без этого не прет

    и еще проблем такая:

    создаю агента:

    <agent name='newAgent' designerversion='6.5'>
    <trigger type='actionsmenu'/>
    </agent>

    импорт делаю, создается база с агентом, но при открытии агента говорит что элемент не подписан, хотя с другими все гуд..

    как его подписать.
    пробовал

    Код (Text):
        Call dbCopy.Sign(DBSIGN_DOC_DATA)
    не канает
     
Загрузка...

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