• Приглашаем на KubanCTF

    Старт соревнований 14 сентября в 10:00 по москве

    Ссылка на регистрацию в соревнованиях Kuban CTF: kubanctf.ru

    Кодебай является технологическим партнером мероприятия

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

seoman2

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

Что делать?
 

garrick

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

seoman2

Green Team
17.02.2010
507
1
BIT
72
Во проблемка.
Хочу с помощью 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 363
152
BIT
298
Ну, например


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

lmike

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

seoman2

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

lmike

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

Shandrik

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

seoman2

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

seoman2

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


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

seoman2

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

VladSh

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

lmike

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

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