• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Решено Ошибка domParser.Process на больших XML-файлах

seoman2

Green Team
17.02.2010
507
1
BIT
69
Если парсю в агенте на серваке валидную (xmlvalidation.com + барузеры не ругаются) XML размером более 50 мб, то
Set domParser=session.CreateDOMParser(strm, outputStream)
domParser.Process
выдает ошибку 4602

Что делать?
 

garrick

Lotus Team
26.10.2009
1 352
151
BIT
202
Что такое 4602 не знаю, но могу предположить, что возникает "Out of memory". Обычно при разборе больших XML используют SAX парсеры, которые в отличии от DOM разбирают XML в потоке. DOM сначала грузит всё в память и строит там дерево, потом отдаёт это вам - на большой файл вполне может не хватить памяти, это часто распространённый случай. Но для начала попробуйте увеличить размер памяти для Java в notes.ini, вдруг поможет.
 

seoman2

Green Team
17.02.2010
507
1
BIT
69
Во проблемка.
Хочу с помощью saxParser получить значение текста с:
<nameru>хочу этот текст</nameru>

в кнопочке есть
Код:
    Set saxParser=session.CreateSAXParser....
 On Event SAX_Characters From saxParser Call SAXCharacters ' содержимое элемента
 On Event SAX_StartElement  From saxParser Call SAXStartElement 'старт элемента

Но вот как в
Код:
Sub SAXStartElement (Source As Notessaxparser, Byval elementname As String, Attributes As NotesSaxAttributeList)
    Dim i As Integer
        If elementname="nameru" Then
....
получить сам текст?
 

garrick

Lotus Team
26.10.2009
1 352
151
BIT
202
Ну, например


тут правда всё про Java, но в общем алгоритм действий должен быть такой же.
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
получить сам текст?
т.к. SAX последовательно обрабатывает поток, то на появление нужного элемента/ов взводите флажок (или глобальную переменную определяете, например- currentElement=elementname) и анализируете её значение в др. калбэк:
On Event SAX_Characters From saxParser Call SAXCharacters
см. тут
 
  • Нравится
Реакции: seoman2

seoman2

Green Team
17.02.2010
507
1
BIT
69
А если мне нужно парсить определенный элемент с xml-дерева, то надо во временные переменные все уровни дерева закидывать?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
А если мне нужно парсить определенный элемент с xml-дерева, то надо во временные переменные все уровни дерева закидывать?
зачем все - просто конструируете текущую ветку (до появления end element, после него удаляете часть пути)
типа на старт: current=previous +{/}+ elementname
на завершение: current=StrLeftBack(current,{/})
ну и сравниваете с "нужным/ми" полным путем/ми элемента
 
Последнее редактирование:
  • Нравится
Реакции: seoman2
S

Shandrik

А там точно не матершинный символ?
Имел такую же проблемку при подготовке данных для отчёта. В XML собирались поля документов. После добавления в этот список поля, заполняемого юзерами, стали попадаться ошибки - они туда нецензурные символы складывали, видимо, копипастом. Пришлось дробить дихотомией XML-ку, пока не находилась крокозябра. После её удаления из документа, функционирование восстанавливалась.
 

seoman2

Green Team
17.02.2010
507
1
BIT
69
Сделал всё на SAX. На одном серваке файл 100 мб парситься, на другом тот же файл - ошибка на saxParser.Process .
AMgr: Agent error message: SAX parser operation failed
версии у обоих 9.0.1
 

seoman2

Green Team
17.02.2010
507
1
BIT
69
Вот мой код и результаты опытов в посте 2.


Проблема решена. Всем спасибо!
 
Последнее редактирование:

seoman2

Green Team
17.02.2010
507
1
BIT
69
1 - для больших файлов только SAX парсер.
2 - в notes.ini удалил все лимиты для JVM. По ходу сервак лучше знает, сколько ему надо памяти.
 

VladSh

начинающий
Lotus Team
11.12.2009
1 786
157
BIT
80
Вот мой код и результаты опытов в посте 2.
2 - в notes.ini удалил все лимиты для JVM. По ходу сервак лучше знает, сколько ему надо памяти.
Непонятно, зачем было удалять лимиты для JVM, если код на LS?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 941
609
BIT
217
Непонятно, зачем было удалять лимиты для JVM, если код на LS?
мало того - если удалить лимиты - они станут дефолтными (кот. часто мало для чего-то затратного по памяти), могут посыпаться агенты на java (если они были)
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!