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

dimat

Lotus team
31.07.2008
516
0
#1
Всем привет!
Есть строка s as String.
Ее значение равно текст в формате XML, с помощью чего можно взять значения определенных тегов?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#3
всё хорошо в этом парсере..., кроме того, что он - DOM
т.е. сразу время на создание дерева и память на негоже
если данные небольшие - это не проблема

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

oshmianski

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#6
дерево строится по индексам - индексируют поток
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#7
То есть это выгодно, когда надо несколько раз бегать по одному и тому же дереву, а для одноразового прохода и сбора данных затратится ещё и время на индексацию, правильно?
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#8
несовсем, построение дерева и аллокаизация памяти (реальная, с копированием данных) - достаточно затратные по времени операции
в случае, например, с ДОМ - происходит построение объектов в памяти
в данном случае - только индекс (условно), весь ли индекс грузят в память - мне не известно
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#9
если под одноразовым проходом понимается SAX - то надо учитывать ограничения SAX...
отсутствие рандомного доступа, невозможность проследить связь нод, без создания доп. структур...
да - для того чтобы просто выцепить ноду SAX будет "эффективным", но как только возникнет доп. задачи по связанная с записью или анализом - тут и появятся необходимость в др. ср-вах
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#10
несовсем, построение дерева и аллокаизация памяти (реальная, с копированием данных) - достаточно затратные по времени операции
в случае, например, с ДОМ - происходит построение объектов в памяти
в данном случае - только индекс (условно), весь ли индекс грузят в память - мне не известно
Но ведь для "выработки индекса" тоже нужна память?
Если индекс вырабатывается и сгружается для освобождения памяти куда-то, а это скорее всего на диск)) то мы от дисковой подсистемы сразу же получаем ограничение в скорости.. И если индексы не хранятся в памяти, смысл использования явно не в скорости.

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

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

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#11
ну с ДОМ есть там бенчмарки
ниже (там же) остальные тесты (ссылки), в том числе и SAX присутствует, по пропускной способности VTD всех побил :), расход памяти, разумеется, у SAX отсутствует
 

lionk

Well-known member
05.04.2007
310
2
#12
Поделитесь пожалуйста удобным парсером на LS, чтобы легко находить нужные ноды, править их свойства, создавать, удалять...
а то надоело в стринг переменную собирать.
 
13.03.2009
625
1
#14
Поделитесь пожалуйста удобным парсером на LS, чтобы легко находить нужные ноды, править их свойства, создавать, удалять...
есть штатный NotesDomParser.
надоело в стринг переменную собирать
если проблема в скорости - собирайте в stream
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#15
собирайте в stream
здесь есть оговорка - до 2-ух Гб (где-то) обсуждалось здесь...
если собирать в джавастрим (кусками) - нет такого ограничения
 
13.03.2009
625
1
#16
здесь есть оговорка - до 2-ух Гб (где-то) обсуждалось здесь...
если собирать в джавастрим (кусками) - нет такого ограничения
угу. но двухгиговая строка - не самый частый зверь :) Первый том войны и мира в библиотеке Мошкова весит 1(один) мегабайт.
 

savl

Lotus team
28.10.2011
2 136
105
#17
Есть 30 метровый xml, надо распарсить. nu.xom.Builder падает при постройке парсера: java.lang.OutOfMemoryError
Работает в NotesAgent, проблема именно в размере файла.
Вопрос: чем лучше распарсить? XOM выбрал, так как ест меньше памяти чем jDom.
В Eclipse файл обрабатывается за 2-3 минуты, причем параллельно создает свою сокращенную копию, а тут даже парсер не строится...

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

savl

Lotus team
28.10.2011
2 136
105
#19
Вот да, тоже начал читать... не могу разобраться как получить следующий элемент "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);
 

lmike

нет, пердело совершенство
Lotus team
27.08.2008
6 586
272
#20
яж пример давал (и здесь в том числе):
<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