• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

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

  • Автор темы JohnLemon
  • Дата начала
J

JohnLemon

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

ty3uk

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

JohnLemon

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

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
JohnLemon, лучше английский подтянуть, так же хелп в инете есть на русском.

Вот примерчик:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
:) мой бубнеж - код по ссылка тяжело читается... стринги надо было выносить в декларации, для переноса строк есть зарезервированные (для файлов), а для текста лучше использовать Chr(10), копипаста блоков с ифами (ваще пиндец)
/закончил бубнить :)

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

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

Добавлено: вот еще (там же)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
и для отладки и использования очень рекомендую сам инструмент oXygen

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

JohnLemon

:) мой бубнеж - код по ссылка тяжело читается... стринги надо было выносить в декларации, для переноса строк есть зарезервированные (для файлов), а для текста лучше использовать Chr(10), копипаста блоков с ифами (ваще пиндец)
/закончил бубнить :)

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

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

Добавлено: вот еще (там же)
XSLT меня сейчас убил ничего не понятно стало ) пошел читать неужели примеров попроще ) ?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
XSLT меня сейчас убил ничего не понятно стало
это процедурный язык, там вовсе ничего сложного
шаблон - это так и есть - шаблон поиска, для каждого фрагмента попадающего по него - будет вызван код, кот. и написан (подстановка)
шаблон м.б. вложенным
нэйм-спейс - это то, что позволяет шаблону не замечать др. нс
и что здесь сложного?
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
159
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>


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

JohnLemon

и что здесь сложного?
Как его использовать )

Добавлено:
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
7 933
609
BIT
177
Как его использовать )

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

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
там док в html преобразуется (а не ПДФ) - обшибся
в вашем случае на вход преобразованию сувается стрим с xml, второй стрим - это stylesheet (таблица преобразований)
пример демонстрирует цепочку включающую в себя и XSLT и parser после обработки (выдергиваются имеджи и кладутся на диск)
 
T

ty3uk

это перевод каретки (т.е. "интер"), зачастую при импорте XML надо переводы кареток убрать, иначе, при корявом коде, будет текстовое поле импортироваться не за один проход, а за несколько, сотвественно увеличиваются сложности и отслеживание данного дела.
 
J

JohnLemon

это перевод каретки (т.е. "интер"), зачастую при импорте XML надо переводы кареток убрать, иначе, при корявом коде, будет текстовое поле импортироваться не за один проход, а за несколько, сотвественно увеличиваются сложности и отслеживание данного дела.
Пасиб ) я так понимаю тут три человека весь форум держат ;)
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 933
609
BIT
177
А можно вопрос еще
Это для чего делается ?
на самом деле там много чего "неправильно" и про переводы кареток я писал выше (есть платформенный). Конкретно этот случай - виндовый перевод каретки, в остальных системах он короче - LF = Chr(10)
мало того - мессаджбоксы нотусни кажуть Chr(10) и Chr(13) там просто мешает
еще большой вопрос с кодировкой, кот. не затронута, для винды она UTF-16, но поддерживаются и др., вот с этого места и начинаются проблемы, в др. системах принята основной UTF-8
вощем так... рекомендовал бы пользовать UTF-8 и Chr(10) (в нормальных редакторах и просмотрщиках проблем не будет)
 
J

JohnLemon

вощем так... рекомендовал бы пользовать UTF-8 и Chr(10) (в нормальных редакторах и просмотрщиках проблем не будет)
Спасибо за помощь, ты мне очень помогаешь в освоении лотуса )
 
J

JohnLemon

Сделал пока так:
Код:
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 ?? и Как прерывать цикл и перейти на следующую "итерацию" Если уже есть документ с таким именем ??
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!