Создание Документов Из Xml

JohnLemon

Well-Known Member
20.08.2014
274
5
32
Омск
#1
Здравствуйте, подскажите пожалуйста, есть форма на ней поля uName, uId, uDayHolliday. Необходимо написать агента который будет создавать документы для этой формы, а данные брать через xml файл такого содержания:
Код:
<?xml version="1.0" encoding="UTF-8"?>
<note>
<user>
<name>Вася</name>
<id>01</id>
<DayHolliday>10</DayHolliday>
</user>
</note>
Может кто подсказать как это сделать, какой класс лучше использовать, а лучше рабочий примерчик или ссылку с описанием как это делать, только как можно проще и понятнее :)
 

ty3uk

Well-Known Member
31.03.2008
170
0
#2
NotesDOMParser, NotesSAXParser выбирай что больше подходит.
Примеры есть в лотусовой помощи. Но для того чтобы их понять, надо вообще понимать что из себя представляют DOM и SAX идеология работы с XML. А это платформо-независимое, можно в инете кучу примеров и объяснения найти.
 

JohnLemon

Well-Known Member
20.08.2014
274
5
32
Омск
#3
NotesDOMParser, NotesSAXParser выбирай что больше подходит.
Примеры есть в лотусовой помощи. Но для того чтобы их понять, надо вообще понимать что из себя представляют DOM и SAX идеология работы с XML. А это платформо-независимое, можно в инете кучу примеров и объяснения найти.
С английским не очень хотелось бы простой примерчик посмотреть )
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#5
:) мой бубнеж - код по ссылка тяжело читается... стринги надо было выносить в декларации, для переноса строк есть зарезервированные константы (для файлов), а для текста лучше использовать Chr(10), копипаста блоков с ифами (ваще пиндец)
/закончил бубнить :)

возится с DOM - это писать код на LS, порой, задача сводится к элементарному XSLT , а изучить XSLT будет только +
в случае простого xml, как в топике - да, можно обойтись и DOM
для больших xml - SAX
для всего остального - XSLT

Добавлено: вот один из примеров (не учитывая нек. специфику - там нет нэймспесов, и это - плохо) http://www.oxygenxml.com/archives/xsl-list...3/msg00048.html

Добавлено: вот еще (там же) http://www.oxygenxml.com/archives/xsl-list...3/msg00049.html
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#6
и для отладки и использования очень рекомендую сам инструмент oXygen

Добавлено: здесь решалась обратная задача
но суть д.б. ясна - исключение префиксов из результата (там атрибут есть) т.е. исходных хмл имеет ns кот. будет представлять какбэ домину, в резалт - доминошный
 

JohnLemon

Well-Known Member
20.08.2014
274
5
32
Омск
#7
:) мой бубнеж - код по ссылка тяжело читается... стринги надо было выносить в декларации, для переноса строк есть зарезервированные константы (для файлов), а для текста лучше использовать Chr(10), копипаста блоков с ифами (ваще пиндец)
/закончил бубнить :)

возится с DOM - это писать код на LS, порой, задача сводится к элементарному XSLT , а изучить XSLT будет только +
в случае простого xml, как в топике - да, можно обойтись и DOM
для больших xml - SAX
для всего остального - XSLT

Добавлено: вот один из примеров (не учитывая нек. специфику - там нет нэймспесов, и это - плохо) http://www.oxygenxml.com/archives/xsl-list...3/msg00048.html

Добавлено: вот еще (там же) http://www.oxygenxml.com/archives/xsl-list...3/msg00049.html
XSLT меня сейчас убил ничего не понятно стало ) пошел читать неужели примеров попроще ) ?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#8
XSLT меня сейчас убил ничего не понятно стало
это процедурный язык, там вовсе ничего сложного
шаблон - это так и есть - шаблон поиска, для каждого фрагмента попадающего по него - будет вызван код, кот. и написан (подстановка)
шаблон м.б. вложенным
нэйм-спейс - это то, что позволяет шаблону не замечать др. нс
и что здесь сложного?
 

savl

Well-Known Member
Lotus team
28.10.2011
2 116
157
32
#9
JohnLemon
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
Код:
Set inputStr = ses.Createstream()
If Not inputStr.Open(Environ("TEMP") & "\" & "Import.xml") Then
Error 5500, "Не найден файл: " & Environ("TEMP") & "\" & "Import.xml"
End If

If inputStr.Bytes = 0 Then
Print DESIGN & " Empty file Import.xml"
GoTo endh
End If 

Set DOM = ses.Createdomparser(inputStr)
Call dom.Process()

Dim docNode As NotesDOMDocumentNode
Dim docElem As NotesDOMElementNode
Dim child As NotesDOMNode
Dim child2 As NotesDOMNode
Dim nextSubl As NotesDOMNode
Dim nextSubl2 As NotesDOMNode
Dim itChild As NotesDOMNode
Dim result As String

Print DESIGN & " Создаем/обновляем документы."

Set docNode = DOM.Document
If Not docNode.IsNull Then
Set docElem = docNOde.Documentelement
Set child = docElem.Firstchild
Set nextSubl = child.Nextsibling

While Not nextSubl.Isnull 
Set child2 = nextSubl.Firstchild
Set nextSubl2 = child2.Nextsibling 'guid
result = ""

While Not nextSubl2.Isnull
Set itChild = nextSubl2.Firstchild
If Not itChild.Isnull then

Select Case (nextSubl2.Nodename)
Case "DisplayName":
If InStr(itChild.Nodevalue,{,})>0 then
FieldsList("FullName")=FullTrim(StrLeft(itChild.Nodevalue,{,}) & " " &StrRight(itChild.Nodevalue,{,}))
Else
FieldsList("FullName")=itChild.Nodevalue
End if
Case "LastName":
FieldsList("LastName")=itChild.Nodevalue			
Case "GivenName":
FieldsList("FirstName")=itChild.Nodevalue			
Case "Company":
FieldsList("CompanyName")=itChild.Nodevalue			
Case "SMTPAddress":
FieldsList("MailAddress")=itChild.Nodevalue
FieldsList("InternetAddress")=itChild.Nodevalue			
Case Else:
End Select

End If

Set nextSubl2 = nextSubl2.Nextsibling
Set nextSubl2 = nextSubl2.Nextsibling
Wend


' Создание документа 

Set doc = view.Getdocumentbykey(FieldsList("MailAddress"), true)

If Doc Is Nothing Then 
Set doc = db.Createdocument()
Call doc.Replaceitemvalue("Form", "Person")
Call doc.Replaceitemvalue("Type", "Person")
Call doc.Replaceitemvalue("ImportDoc", "Import")
End If

ForAll x In FieldsList
Call doc.Replaceitemvalue(ListTag(x), x)
End ForAll

Call doc.Save(true,false)

FieldsList("FullName")=""
FieldsList("LastName")=""
FieldsList("FirstName")=""
FieldsList("CompanyName")=""
FieldsList("MailAddress")=""
FieldsList("InternetAddress")=""
Set nextSubl = nextSubl.Nextsibling
Set nextSubl = nextSubl.Nextsibling

Wend
End If
парситься вот это:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ContactList Count="">
<Contact>
<GUID></GUID>
<DisplayName></DisplayName>
<LastName></LastName>
<GivenName></GivenName>
<Alias></Alias>
<Username></Username>
<UPN/>
<EmployeeID/>
<DN/>
<Enabled></Enabled>
<Hidden></Hidden>
<Description/>
<PersonalTitle/>
<Title/>
<Street></Street>
<Postcode></Postcode>
<City></City>
<Country></Country>
<Company></Company>
<Department></Department>
<Office></Office>
<PhoneNumber></PhoneNumber>
<FacsimileNumber></FacsimileNumber>
<MobileNumber/>
<SMTPAddress></SMTPAddress>
<Manager/>
<OtgActive></OtgActive>
<CostCenter/>
<LastLogon/>
<DateCreated></DateCreated>
<DateChanged/>
<DateDeleted/>
<Internal></Internal>
<External></External>
<Portal></Portal>
<Ressource></Ressource>
<Version></Version>
<USN></USN>
</Contact>
</ContactList>


Добавлено: Писалось давно, уже не используется, код вполне рабочий, но не оптимальный.
 

JohnLemon

Well-Known Member
20.08.2014
274
5
32
Омск
#10
Как его использовать )

Добавлено:
JohnLemon
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Код</div></div><div class="sp-body"><div class="sp-content">
Код:
Set inputStr = ses.Createstream()
If Not inputStr.Open(Environ("TEMP") & "\" & "Import.xml") Then
Error 5500, "Не найден файл: " & Environ("TEMP") & "\" & "Import.xml"
End If

If inputStr.Bytes = 0 Then
Print DESIGN & " Empty file Import.xml"
GoTo endh
End If 

Set DOM = ses.Createdomparser(inputStr)
Call dom.Process()

Dim docNode As NotesDOMDocumentNode
Dim docElem As NotesDOMElementNode
Dim child As NotesDOMNode
Dim child2 As NotesDOMNode
Dim nextSubl As NotesDOMNode
Dim nextSubl2 As NotesDOMNode
Dim itChild As NotesDOMNode
Dim result As String

Print DESIGN & " Создаем/обновляем документы."

Set docNode = DOM.Document
If Not docNode.IsNull Then
Set docElem = docNOde.Documentelement
Set child = docElem.Firstchild
Set nextSubl = child.Nextsibling

While Not nextSubl.Isnull 
Set child2 = nextSubl.Firstchild
Set nextSubl2 = child2.Nextsibling 'guid
result = ""

While Not nextSubl2.Isnull
Set itChild = nextSubl2.Firstchild
If Not itChild.Isnull then

Select Case (nextSubl2.Nodename)
Case "DisplayName":
If InStr(itChild.Nodevalue,{,})>0 then
FieldsList("FullName")=FullTrim(StrLeft(itChild.Nodevalue,{,}) & " " &StrRight(itChild.Nodevalue,{,}))
Else
FieldsList("FullName")=itChild.Nodevalue
End if
Case "LastName":
FieldsList("LastName")=itChild.Nodevalue			
Case "GivenName":
FieldsList("FirstName")=itChild.Nodevalue			
Case "Company":
FieldsList("CompanyName")=itChild.Nodevalue			
Case "SMTPAddress":
FieldsList("MailAddress")=itChild.Nodevalue
FieldsList("InternetAddress")=itChild.Nodevalue			
Case Else:
End Select

End If

Set nextSubl2 = nextSubl2.Nextsibling
Set nextSubl2 = nextSubl2.Nextsibling
Wend


' Создание документа 

Set doc = view.Getdocumentbykey(FieldsList("MailAddress"), true)

If Doc Is Nothing Then 
Set doc = db.Createdocument()
Call doc.Replaceitemvalue("Form", "Person")
Call doc.Replaceitemvalue("Type", "Person")
Call doc.Replaceitemvalue("ImportDoc", "Import")
End If

ForAll x In FieldsList
Call doc.Replaceitemvalue(ListTag(x), x)
End ForAll

Call doc.Save(true,false)

FieldsList("FullName")=""
FieldsList("LastName")=""
FieldsList("FirstName")=""
FieldsList("CompanyName")=""
FieldsList("MailAddress")=""
FieldsList("InternetAddress")=""
Set nextSubl = nextSubl.Nextsibling
Set nextSubl = nextSubl.Nextsibling

Wend
End If
парситься вот это:
<?xml version="1.0" encoding="ISO-8859-1"?>
<ContactList Count="">
<Contact>
<GUID></GUID>
<DisplayName></DisplayName>
<LastName></LastName>
<GivenName></GivenName>
<Alias></Alias>
<Username></Username>
<UPN/>
<EmployeeID/>
<DN/>
<Enabled></Enabled>
<Hidden></Hidden>
<Description/>
<PersonalTitle/>
<Title/>
<Street></Street>
<Postcode></Postcode>
<City></City>
<Country></Country>
<Company></Company>
<Department></Department>
<Office></Office>
<PhoneNumber></PhoneNumber>
<FacsimileNumber></FacsimileNumber>
<MobileNumber/>
<SMTPAddress></SMTPAddress>
<Manager/>
<OtgActive></OtgActive>
<CostCenter/>
<LastLogon/>
<DateCreated></DateCreated>
<DateChanged/>
<DateDeleted/>
<Internal></Internal>
<External></External>
<Portal></Portal>
<Ressource></Ressource>
<Version></Version>
<USN></USN>
</Contact>
</ContactList>


Добавлено: Писалось давно, уже не используется, код вполне рабочий, но не оптимальный.
Вот за примерчик спасибо покалупаюсь на досуге )
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#11
Как его использовать )

Добавлено:
Вот за примерчик спасибо покалупаюсь на досуге )
выкладывал здесь код либы, кот. из нотусевого дока делала ПДФ (с оговорками)
основное - там есть и XSLT и DOMparser
все было сделано на классах (где-то корявенько - в части подключения парсера)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#14
там док в html преобразуется (а не ПДФ) - обшибся
в вашем случае на вход преобразованию сувается стрим с xml, второй стрим - это stylesheet (таблица преобразований)
пример демонстрирует цепочку включающую в себя и XSLT и parser после обработки (выдергиваются имеджи и кладутся на диск)
 

ty3uk

Well-Known Member
31.03.2008
170
0
#16
это перевод каретки (т.е. "интер"), зачастую при импорте XML надо переводы кареток убрать, иначе, при корявом коде, будет текстовое поле импортироваться не за один проход, а за несколько, сотвественно увеличиваются сложности и отслеживание данного дела.
 

JohnLemon

Well-Known Member
20.08.2014
274
5
32
Омск
#17
это перевод каретки (т.е. "интер"), зачастую при импорте XML надо переводы кареток убрать, иначе, при корявом коде, будет текстовое поле импортироваться не за один проход, а за несколько, сотвественно увеличиваются сложности и отслеживание данного дела.
Пасиб ) я так понимаю тут три человека весь форум держат ;)
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 438
351
homepage.mac.com
#18
А можно вопрос еще
Это для чего делается ?
на самом деле там много чего "неправильно" и про переводы кареток я писал выше (есть платформенный). Конкретно этот случай - виндовый перевод каретки, в остальных системах он короче - LF = Chr(10)
мало того - мессаджбоксы нотусни кажуть Chr(10) и Chr(13) там просто мешает
еще большой вопрос с кодировкой, кот. не затронута, для винды она UTF-16, но поддерживаются и др., вот с этого места и начинаются проблемы, в др. системах принята основной UTF-8
вощем так... рекомендовал бы пользовать UTF-8 и Chr(10) (в нормальных редакторах и просмотрщиках проблем не будет)
 

JohnLemon

Well-Known Member
20.08.2014
274
5
32
Омск
#20
Сделал пока так:
Код:
For i = 1 To nDocument
'-----------------------------
Set db = ws.CurrentDatabase.Database
Set newDoc = db.Createdocument
newDoc.ReplaceItemValue "Form", "sa"

'------------------------------------------------

Set domlist = domele.GetElementsByTagName("Name")
Set node = domlist.GetItem(i)
newDoc.ReplaceItemValue "Name", node.FirstChild.NodeValue
'Msgbox node.FirstChild.NodeValue
Set domlist = domele.GetElementsByTagName("ID")
Set node = domlist.GetItem(i)
newDoc.ReplaceItemValue "ID", node.FirstChild.NodeValue
'Msgbox node.FirstChild.NodeValue
Set domlist = domele.GetElementsByTagName("Date")
Set node = domlist.GetItem(i)
newDoc.ReplaceItemValue "Date", node.FirstChild.NodeValue
'Msgbox node.FirstChild.NodeValue
'--------------------------------------------------
Call newDoc.Save( True, True )
'--------------------------------------------------
Next
Подскажите, как лучше проверить на существующую запись в базе @dblookup, db.search ?? и Как прерывать цикл и перейти на следующую "итерацию" Если уже есть документ с таким именем ??