Решено Ошибка 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

Что делать?
 
Что такое 4602 не знаю, но могу предположить, что возникает "Out of memory". Обычно при разборе больших XML используют SAX парсеры, которые в отличии от DOM разбирают XML в потоке. DOM сначала грузит всё в память и строит там дерево, потом отдаёт это вам - на большой файл вполне может не хватить памяти, это часто распространённый случай. Но для начала попробуйте увеличить размер памяти для Java в notes.ini, вдруг поможет.
 
Во проблемка.
Хочу с помощью 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
....
получить сам текст?
 
Ну, например


тут правда всё про Java, но в общем алгоритм действий должен быть такой же.
 
получить сам текст?
т.к. SAX последовательно обрабатывает поток, то на появление нужного элемента/ов взводите флажок (или глобальную переменную определяете, например- currentElement=elementname) и анализируете её значение в др. калбэк:
On Event SAX_Characters From saxParser Call SAXCharacters
см. тут
 
  • Нравится
Реакции: seoman2
А если мне нужно парсить определенный элемент с xml-дерева, то надо во временные переменные все уровни дерева закидывать?
 
А если мне нужно парсить определенный элемент с xml-дерева, то надо во временные переменные все уровни дерева закидывать?
зачем все - просто конструируете текущую ветку (до появления end element, после него удаляете часть пути)
типа на старт: current=previous +{/}+ elementname
на завершение: current=StrLeftBack(current,{/})
ну и сравниваете с "нужным/ми" полным путем/ми элемента
 
Последнее редактирование:
  • Нравится
Реакции: seoman2
А там точно не матершинный символ?
Имел такую же проблемку при подготовке данных для отчёта. В XML собирались поля документов. После добавления в этот список поля, заполняемого юзерами, стали попадаться ошибки - они туда нецензурные символы складывали, видимо, копипастом. Пришлось дробить дихотомией XML-ку, пока не находилась крокозябра. После её удаления из документа, функционирование восстанавливалась.
 
Сделал всё на SAX. На одном серваке файл 100 мб парситься, на другом тот же файл - ошибка на saxParser.Process .
AMgr: Agent error message: SAX parser operation failed
версии у обоих 9.0.1
 
Вот мой код и результаты опытов в посте 2.


Проблема решена. Всем спасибо!
 
Последнее редактирование:
1 - для больших файлов только SAX парсер.
2 - в notes.ini удалил все лимиты для JVM. По ходу сервак лучше знает, сколько ему надо памяти.
 
Вот мой код и результаты опытов в посте 2.
2 - в notes.ini удалил все лимиты для JVM. По ходу сервак лучше знает, сколько ему надо памяти.
Непонятно, зачем было удалять лимиты для JVM, если код на LS?
 
Непонятно, зачем было удалять лимиты для JVM, если код на LS?
мало того - если удалить лимиты - они станут дефолтными (кот. часто мало для чего-то затратного по памяти), могут посыпаться агенты на java (если они были)
 
Мы в соцсетях:

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