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

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

  1. seoman2

    seoman2 Lotus team
    Lotus team

    Регистрация:
    17 фев 2010
    Сообщения:
    435
    Симпатии:
    0
    Есть 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 Lotus team
    Lotus team

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

    seoman2 Lotus team
    Lotus team

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

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

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

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

    seoman2 Lotus team
    Lotus team

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

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

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

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

    seoman2 Lotus team
    Lotus team

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

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

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

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

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

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

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

    seoman2 Lotus team
    Lotus team

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

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

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

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

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

    seoman2 Lotus team
    Lotus team

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

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

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

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

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

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

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

    seoman2 Lotus team
    Lotus team

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

    savl Lotus team
    Lotus team

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

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    опять ничего не понимаю...
    и так: есть 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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.082
    Симпатии:
    300
    Код (LotusScript):
    %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
    результат:
    Код (XML):
    <Element3 xmlns="http://www.w3.org/1999/xhtml">
                <E4>44444</E4>
                <E5>5555</E5>
            </Element3>
    если в темплейте поменять каменты:
    Код (XML):
    <?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>
    выдаст:
    Код (XML):
    <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
Загрузка...

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