1. Наш канал codeby в telegram. Пишем об информационной безопасности, методах защиты информации, о программировании. Не пропускай новости с кодебай, будь в тренде ! Подробнее ...

    Скрыть объявление

Копирование в переменную элемента xml

Тема в разделе "Lotus - Программирование", создана пользователем seoman2, 14 май 2015.

  1. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
    Есть XML-ка на винте, например такой структуры:

    <htmlx xmlns="http://www.w3.org/1999/xhtml">
    <RootElement1>
    <Element2 Type="S2">123</Element2>
    <Element3>
    <E4>44444</E4>
    <E5>5555</E5>
    </Element3>
    <Element6>66666</Element6>
    </RootElement1>
    </htmlx>

    Как лучше получить в переменную в виде текстовой строки Element3 ?
     
  2. alexas1

    alexas1 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    10 апр 2014
    Сообщения:
    656
    Симпатии:
    228
    Распарсить:)
    Штатными нотусёвыми (и не только) парсерами.
    Да хоть left\right\mid - string:)
    Гуглить типа parsing XML.
    Тут и на форуме была туева хуча вариантов.
     
  3. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
    Думал с NotesDOMParser через GetElementsByTagName, но он не получает значение элемента с его подэлементами.

    Штатными нотусёвыми (и не только) парсерами. - какими?
     
  4. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    545
    Симпатии:
    13
    Если небольшо XML, то можно DOM использовать (тыц).
    Если большой - SAX (встроенный или сторонний, JAVA через дрижд).
     
  5. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
    А можно файл в поток загнать и считать с stream.ReadText ?
    А потом уже
    Хотя это изврат наверное.

    XmlNodeReader - где библиотеку скачать? Ссылка че-то не открывается даже.
     
    #5 seoman2, 14 май 2015
    Последнее редактирование модератором: 14 май 2015
  6. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    опять...
    откуда файл получился на диске?
    такое ощущение, что вы изобретаете себе сложности, при полном нежелании прислушиваться к советам.
    Нотусевые классы принимают на вход NotesStream и не надо руками ReadText
    прочитайте уже хелп дизайнера, там и примеры есть
     
  7. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
    Он там был.
     
  8. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    откуда?
     
  9. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    545
    Симпатии:
    13
    тыц2
     
  10. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
     
  11. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
  12. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    545
    Симпатии:
    13
    дело хозяйское, но я бы использовал нативные объекты.
     
  13. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    есть люди , мягко-говоря, странные ;)
    в этой схеме остается непонятным выбор платформы, или человек не своим делом занят
     
  14. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
    Если через SAX (я с ним не работал еще), то я смогу получить в текстовую строку элемент со всеми подэлементами?
     
  15. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    SAX - событийный механизм
    проход каждого элемента вызывает событие (CallBack) с передачей параметров
    http://alvabul.narod.ru/LotusScriptXML.htm
    читать про SAX
     
    2 пользователям это понравилось.
  16. oshmianski

    oshmianski Достойный программист
    Lotus team

    Репутация:
    0
    Регистрация:
    25 апр 2012
    Сообщения:
    545
    Симпатии:
    13
    SAX сложнее для понимания и реализации.
    Вам нужно определиться с технологией - DOM или SAX.
    Если объем обрабатываемого XML маленький (ну скажем до 5 МБ), то проще использовать DOM.
    В notes реализованы и DOM и SAX парсеры как нативные классы.
    Ссылку, что я давал, - это просто надстройка над нативным DOM парсером (просто сведено все в одно место и примеры человеческие).

    DOM - это проще говоря дерево в оперативной памяти (полностью все данные в ОП).
    SAX - это как буд-то кадры в окошке кинопроектора (в ОП только один кадр). Т.е. процессор бежит по всей ленте данных и найдя определенную последовательность генерирует соответсвующий вызов функции.

    Судя по тому, что вы благополучно использовали MS XML Parser, вам подойдет XMLNoteReader. Просто разберитесь с ним, там ничего сложного нет.
     
  17. seoman2

    seoman2 Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    17 фев 2010
    Сообщения:
    455
    Симпатии:
    1
    Попробовал и через DOM, и через SAX, что мне не нравиться, что я получаю только сам элемент, а его атрибуты и подэлементы надо снова по дереву искать (если дом), или ждать следующего события с элементом (если сакс). И самому сохранять всё что напарсил. А MS XML Parser дает мне сразу весь объект с атрибутами и подэлементами - как innerhtml в яваскрипте. Мне бы его аналог, но родной в лотусе ))
     
  18. savl

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.116
    Симпатии:
    157
    @seoman2, нет стандартного, только самописки, как эта:
    От я простыню ща запостил... Вот это движок...
     
  19. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    опять ничего не понимаю...
    и так: есть DOM, SAX
    остальное - обвязка над одним или другим (условно)
    XSLT - после построения DOM
    мсхмлпарсёр - это некий конгломерат из всего чего не попадя - комбайн выполняющей все, но "не идеально"
    зачем комбайн - если задача узкая?
    берем простенький xsl и накладываем его на свой xml - профит
    http://stackoverflow.com/questions/...des-of-any-type-of-a-template-context-element
    в случае с большими файлами - смотрим "мой" (в коде есть ссылка на оригинал) велик, на основе SAX (LAX) - там проще отловить только нужный тег
    либо берем либу VTD-XML (но это уже - доп. либа) - пример выкладывал на интетрасте
    http://second-ext.inttrust.ru/site/...39f71f141f7a7c4ac32574890047fb83?OpenDocument
    http://web3.inttrust.ru/site/itforu...0bbcd2d7a458ff78c3257482005cad87!OpenDocument
     
    #19 lmike, 20 май 2015
    Последнее редактирование модератором: 20 май 2015
  20. lmike

    lmike нет, пердело совершенство
    Lotus team

    Репутация:
    3
    Регистрация:
    27 авг 2008
    Сообщения:
    6.406
    Симпатии:
    346
    Код:
    %REM
    *********************************************
    Agent XSLT
    Created May 21, 2015 by Mikhail Cholokov/CRUINTERNET
    Description: Comments for Agent
    %END REM
    Option Public
    Option Declare
     
    Use "ErrorHandling"
    Const xml=_
    |<htmlx xmlns="http://www.w3.org/1999/xhtml"><RootElement1>
    		<Element2 Type="S2">123</Element2>
    		<Element3>
    			<E4>44444</E4>
    			<E5>5555</E5>
    		</Element3>
    		<Element6>66666</Element6>
    </RootElement1></htmlx>|
    'xmlns:xs="http://www.w3.org/2001/XMLSchema"
    'exclude-result-prefixes="xs"
    Const xsl=_
    |<?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:xx="http://www.w3.org/1999/xhtml"
    	version="2.0">
    	<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
    	<xsl:template match="xx:RootElement1">
    			<xsl:apply-templates select="xx:Element3"/>
    	</xsl:template>
    	<xsl:template match="xx:Element3">
    		<xsl:copy-of select="."/>
    		<!--<xsl:copy-of select="*"/>-->
    	</xsl:template>
    </xsl:stylesheet>|
    Sub Initialize
    MsgBox Transform(xml,xsl)
    End Sub
     
    %REM
    *--------------------------------------------
    Function Transform
    Description: Comments for Function
    %END REM
    function Transform(xml As String, xsl As String) As String
    Dim routineName As String
    routineName="Transform"
    On Error GoTo ErrH
    'your code here
    	Dim transformer As NotesXSLTransformer, ses As New NotesSession
    	Dim strmXML As NotesStream, strmXSL As NotesStream, res As NotesStream
    	Set strmXML=ses.Createstream():Set strmXSL=ses.Createstream():Set res=ses.CreateStream()
    	strmXML.writetext(xml):strmXSL.Writetext(xsl)
    	Set transformer=ses.CreateXSLTransformer(strmXML, strmXSL, res)
    	transformer.Inputvalidationoption=False
    	Call transformer.Process()
    	res.Position=0
    	Do
    		Transform=Transform & res.Readtext()
    	Loop Until res.isEOS
    Quit:
    Exit Function
    ErrH:
    Error Err, RaiseError
    Resume Quit
    End Function
    результат:
    Код:
    <Element3 xmlns="http://www.w3.org/1999/xhtml">
    			<E4>44444</E4>
    			<E5>5555</E5>
    		</Element3>
    если в темплейте поменять каменты:
    Код:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    	xmlns:xx="http://www.w3.org/1999/xhtml"
    	version="2.0">
    	<xsl:output method="xml" version="1.0" omit-xml-declaration="yes" indent="yes"/>
    	<xsl:template match="xx:RootElement1">
    			<xsl:apply-templates select="xx:Element3"/>
    	</xsl:template>
    	<xsl:template match="xx:Element3">
    		<!--<xsl:copy-of select="."/>-->
    		<xsl:copy-of select="*"/>
    	</xsl:template>
    </xsl:stylesheet>
    выдаст:
    Код:
    <E4 xmlns="http://www.w3.org/1999/xhtml">44444</E4>
    <E5 xmlns="http://www.w3.org/1999/xhtml">5555</E5>
    елси не нужен нэймспэйс (а зачем он?) просто убрать обертывающую ноду (<htmlx>)
     
    #20 lmike, 21 май 2015
    Последнее редактирование модератором: 23 май 2015
Загрузка...

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