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

Тема в разделе "Lotus - Программирование", создана пользователем JohnLemon, 7 сен 2014.

  1. JohnLemon

    JohnLemon Well-Known Member

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

    ty3uk Well-Known Member

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

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    С английским не очень хотелось бы простой примерчик посмотреть )
     
  4. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
  5. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    :) мой бубнеж - код по ссылка тяжело читается... стринги надо было выносить в декларации, для переноса строк есть зарезервированные константы (для файлов), а для текста лучше использовать 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
     
  6. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    и для отладки и использования очень рекомендую сам инструмент oXygen

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

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    XSLT меня сейчас убил ничего не понятно стало ) пошел читать неужели примеров попроще ) ?
     
  8. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    это процедурный язык, там вовсе ничего сложного
    шаблон - это так и есть - шаблон поиска, для каждого фрагмента попадающего по него - будет вызван код, кот. и написан (подстановка)
    шаблон м.б. вложенным
    нэйм-спейс - это то, что позволяет шаблону не замечать др. нс
    и что здесь сложного?
     
  9. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    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">
    Код (LotusScript):
    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>


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

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Как его использовать )

    Добавлено:
    Вот за примерчик спасибо покалупаюсь на досуге )
     
  11. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    выкладывал здесь код либы, кот. из нотусевого дока делала ПДФ (с оговорками)
    основное - там есть и XSLT и DOMparser
    все было сделано на классах (где-то корявенько - в части подключения парсера)
     
  12. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
  13. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Пасиба буду копаться там так много всего )
     
  14. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    там док в html преобразуется (а не ПДФ) - обшибся
    в вашем случае на вход преобразованию сувается стрим с xml, второй стрим - это stylesheet (таблица преобразований)
    пример демонстрирует цепочку включающую в себя и XSLT и parser после обработки (выдергиваются имеджи и кладутся на диск)
     
  15. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    А можно вопрос еще
    Это для чего делается ?
     
  16. ty3uk

    ty3uk Well-Known Member

    Регистрация:
    31 мар 2008
    Сообщения:
    169
    Симпатии:
    0
    это перевод каретки (т.е. "интер"), зачастую при импорте XML надо переводы кареток убрать, иначе, при корявом коде, будет текстовое поле импортироваться не за один проход, а за несколько, сотвественно увеличиваются сложности и отслеживание данного дела.
     
  17. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Пасиб ) я так понимаю тут три человека весь форум держат ;)
     
  18. lmike

    lmike нет, пердело совершенство
    Команда форума Lotus team

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    на самом деле там много чего "неправильно" и про переводы кареток я писал выше (есть платформенный). Конкретно этот случай - виндовый перевод каретки, в остальных системах он короче - LF = Chr(10)
    мало того - мессаджбоксы нотусни кажуть Chr(10) и Chr(13) там просто мешает
    еще большой вопрос с кодировкой, кот. не затронута, для винды она UTF-16, но поддерживаются и др., вот с этого места и начинаются проблемы, в др. системах принята основной UTF-8
    вощем так... рекомендовал бы пользовать UTF-8 и Chr(10) (в нормальных редакторах и просмотрщиках проблем не будет)
     
  19. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Спасибо за помощь, ты мне очень помогаешь в освоении лотуса )
     
  20. JohnLemon

    JohnLemon Well-Known Member

    Регистрация:
    20 авг 2014
    Сообщения:
    274
    Симпатии:
    5
    Сделал пока так:
    Код (Text):
    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 ?? и Как прерывать цикл и перейти на следующую "итерацию" Если уже есть документ с таким именем ??
     
Загрузка...

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