1. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

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

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

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

Метки:
  1. dimat

    dimat Well-Known Member
    Lotus team

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

    oshmianski Гость

    Репутация:
    0
  3. lmike

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

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

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

    oshmianski Гость

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    lionk Well-Known Member

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

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

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

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

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

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

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

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.114
    Симпатии:
    157
    Есть 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

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

    savl Well-Known Member
    Lotus team

    Репутация:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    2.114
    Симпатии:
    157
    Вот да, тоже начал читать... не могу разобраться как получить следующий элемент "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);
     
  20. lmike

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

    Репутация:
    1
    Регистрация:
    27 авг 2008
    Сообщения:
    6.361
    Симпатии:
    336
    яж пример давал (и здесь в том числе):
    <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">Тема: XML, DXL и прочая... очередной экзампел (выдергиватель файлов)
    Mikhail Cholokov, 10:07:2008 20:52

    История началась давно, но покоя тема не дает :)
    всякие тулзы сопутствующие Домине для XML не слишком гибки/быстры/лаконичны/итп

    были поиски и экзампелы
    Первый про LAX - тыцаем сюды
    Второй про VTD - тыцаем сюды

    теперь вариант такой - пользуем VTD-XML:
    <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'>import java.io.*;
    import com.ximpleware.*;

    public class save_base64stream {

    public static void main(String[] args) throws Exception {
    VTDGen vg = new VTDGen();

    // AutoPilot ap = new AutoPilot();
    // ap.selectXPath("/document/item/object/file/filedata/text()");

    AutoPilot apAttr = new AutoPilot();

    apAttr.selectXPath("/document/item/object/file");

    if (vg.parseFile("./exported2.dxl", true)) {
    VTDNav vn = vg.getNav();
    apAttr.bind(vn);

    // ap.bind(vn);

    int i, iAttr;
    String fileName;

    while ((iAttr = apAttr.evalXPath()) != -1) {
    iAttr = vn.getAttrVal("name");
    fileName = vn.toString(iAttr);

    // System.out.println(fileName);

    i = -1;
    vn.toElement(VTDNav.FIRST_CHILD, "filedata");
    i = vn.getText();
    Base64.decodeToFile(vn.toString(i), "test-" + fileName);
    vn.toElement(VTDNav.PARENT);

    // FileOutputStream fos = new FileOutputStream("test"+fileName);
    // fos.write(s.getBytes());
    // fos.close();
    // System.out.println(vn.toString(i));
    }
    }
    }
    }[/CODE]Base64 класс был в первом примере. Или последний можно взять здесь.

    компилить можно так:
    javac -classpath ./:./vtd-xml.jar ./save_base64stream.java

    !в текущем путе д.б. Base64.class

    запущать можно так:
    java -cp ./:./vtd-xml.jar save_base64stream
     
Загрузка...

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