Xml

deeeman

Well-Known Member
04.12.2007
383
0
#1
столкнулся с проблемой создания 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 (только какой я не в курсе)

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

Sandr

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

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#3
Не надо у меня ничё покупать, я так отдам :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]
 

deeeman

Well-Known Member
04.12.2007
383
0
#4
я счастлив за эти строчки)))

Код:
	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 ...
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#5
Не, тут я не в теме.
Слова Rational Rose забыл, как только окончил универ или даже чуть раньше :D
 

deeeman

Well-Known Member
04.12.2007
383
0
#6
на самом деле зря забыл)

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

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


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

Sandr

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

deeeman

Well-Known Member
04.12.2007
383
0
#8
вот самому и приходится писать)))))
а найти не удавалось.

ОРшибка у меня с 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]
 

Omh

Well-Known Member
Lotus team
04.07.2007
2 210
1
#9
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>

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

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

Sandr

Гость
#10
а чем кроет? в какой строчке ошибка не говорит?
 

deeeman

Well-Known Member
04.12.2007
383
0
#11
выяснилось что базу надо создавать с дефолтовой вьюхой, без этого не прет

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

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

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

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

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

Код:
	Call dbCopy.Sign(DBSIGN_DOC_DATA)
не канает