Чем прочитать XML

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

Метки:
  1. dimat

    dimat Lotus team
    Lotus team

    Регистрация:
    31 июл 2008
    Сообщения:
    518
    Симпатии:
    0
    Всем привет!
    Есть строка s as String.
    Ее значение равно текст в формате XML, с помощью чего можно взять значения определенных тегов?
     
  2. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    всё хорошо в этом парсере..., кроме того, что он - DOM
    т.е. сразу время на создание дерева и память на негоже
    если данные небольшие - это не проблема

    Добавлено: для больших объёмов меня заинтересовал vtd-xml
     
  3. oshmianski

    oshmianski Гость

    спасибо за ссылку.
    я как-то тоже выбирал. остановился на Saxon, ибо XSLT 2.0 нужен был.
     
  4. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Если в двух словах, в чём там принцип? За счёт чего скорость и экономия ресурсов?
     
  5. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    дерево строится по индексам - индексируют поток
     
  6. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    То есть это выгодно, когда надо несколько раз бегать по одному и тому же дереву, а для одноразового прохода и сбора данных затратится ещё и время на индексацию, правильно?
     
  7. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    несовсем, построение дерева и аллокаизация памяти (реальная, с копированием данных) - достаточно затратные по времени операции
    в случае, например, с ДОМ - происходит построение объектов в памяти
    в данном случае - только индекс (условно), весь ли индекс грузят в память - мне не известно
     
  8. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    если под одноразовым проходом понимается SAX - то надо учитывать ограничения SAX...
    отсутствие рандомного доступа, невозможность проследить связь нод, без создания доп. структур...
    да - для того чтобы просто выцепить ноду SAX будет "эффективным", но как только возникнет доп. задачи по связанная с записью или анализом - тут и появятся необходимость в др. ср-вах
     
  9. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Но ведь для "выработки индекса" тоже нужна память?
    Если индекс вырабатывается и сгружается для освобождения памяти куда-то, а это скорее всего на диск)) то мы от дисковой подсистемы сразу же получаем ограничение в скорости.. И если индексы не хранятся в памяти, смысл использования явно не в скорости.

    Буду знать, спасибо! Собственно, наверное, это и есть область применения.

    А по скорости интересно было бы глянуть тесты... (риторический вопрос :))
     
  10. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    ну с ДОМ есть там бенчмарки
    ниже (там же) остальные тесты (ссылки), в том числе и SAX присутствует, по пропускной способности VTD всех побил :), расход памяти, разумеется, у SAX отсутствует
     
  11. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Наглядно; спасибо! :(
     
  12. lionk

    lionk Well-Known Member

    Регистрация:
    5 апр 2007
    Сообщения:
    308
    Симпатии:
    3
    Поделитесь пожалуйста удобным парсером на LS, чтобы легко находить нужные ноды, править их свойства, создавать, удалять...
    а то надоело в стринг переменную собирать.
     
  13. NickProstoNick

    NickProstoNick Статус как статус :)

    Регистрация:
    22 авг 2008
    Сообщения:
    1.766
    Симпатии:
    39
    :) можешь написать сам
     
  14. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    есть штатный NotesDomParser.
    если проблема в скорости - собирайте в stream
     
  15. lmike

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

    Регистрация:
    27 авг 2008
    Сообщения:
    6.073
    Симпатии:
    299
    здесь есть оговорка - до 2-ух Гб (где-то) обсуждалось здесь...
    если собирать в джавастрим (кусками) - нет такого ограничения
     
  16. turumbay

    Регистрация:
    13 мар 2009
    Сообщения:
    625
    Симпатии:
    2
    угу. но двухгиговая строка - не самый частый зверь :) Первый том войны и мира в библиотеке Мошкова весит 1(один) мегабайт.
     
  17. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Есть 30 метровый xml, надо распарсить. nu.xom.Builder падает при постройке парсера: java.lang.OutOfMemoryError
    Работает в NotesAgent, проблема именно в размере файла.
    Вопрос: чем лучше распарсить? XOM выбрал, так как ест меньше памяти чем jDom.
    В Eclipse файл обрабатывается за 2-3 минуты, причем параллельно создает свою сокращенную копию, а тут даже парсер не строится...

    Еще может получится достигнуть эффекта через настройки jvm?
    текущие:
    vmarg.Xmx=-Xmx1024m
    vmarg.Xms=-Xms512m
    vmarg.Xmca=-Xmca2m
     
  18. VladSh

    VladSh начинающий
    Lotus team

    Регистрация:
    11 дек 2009
    Сообщения:
    1.251
    Симпатии:
    2
    Как вариант: VTD-XML.
     
  19. savl

    savl Lotus team
    Lotus team

    Регистрация:
    28 окт 2011
    Сообщения:
    2.051
    Симпатии:
    146
    Вот да, тоже начал читать... не могу разобраться как получить следующий элемент "Contact"...
    Не поможете?
    <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"><!--shcode--><pre><code class='java'>VTDNav vn = vg.getNav();
    if (vn.matchElement("ContactList"))
    count = vn.getAttrVal("Count");
    System.out.println("\tFound count: " + vn.toString(count)); //Вывод значения по индексу Count
    AutoPilot ap = new AutoPilot(vn);
    ap.selectXPath("//Contact"); // + rootTag);
    result = ap.evalXPath();
    while (result != -1) {
    // evaluate XPath Expressions within the Contact tags
    if (vn.toElement(VTDNav.FIRST_CHILD, "DisplayName")) { // in Contact
    do {
    int val = vn.getText();
    if (val != 1) {
    String value = vn.toNormalizedString(val);
    System.out.println("\tFound DisplayName: " + value);
    }
    }
    while(vn.toElement(VTDNav.NEXT_SIBLING, "DisplayName"));
    }
    }[/CODE]UPD: решено - после while(...) надо было поставить vn.toElement(VTDNav.PARENT);
     
Загрузка...

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