2015-04-02 2 views
2

Я прочитал несколько статей о преимуществах использования синтаксического анализа SAX для анализа XML-файлов в Java с помощью DOM. Тот, который обращается больше всего меня (как обсуждалось here) является то, чтоИсключение без памяти при синтаксическом анализе большого XML-файла в синтаксическом анализаторе SAX

Sax подходит для больших XML-файлов и SAX-парсер не загружает файл XML в целом в памяти.

Но теперь, как я уже писал парсер с использованием SAX для вывода объектов из файла XML для большого файла почти 1,4 Гб он генерирует следующее исключение.

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; The parser has encountered more than "64,000" entity expansions in this document; this is the limit imposed by the application. 

В чем проблема с памятью, если файл в целом не загружен в память.

Как я могу решить проблему?

+3

Это не обязательно фактическое ограничение памяти, но защитная мера против DOS-атак, таких как [этот] (https://en.wikipedia.org/wiki/Billion_laughs). Если ваш входной XML юридически содержит много объектов, вы можете увеличить этот предел в своем парсере. Посмотрите на его документацию. – Tomalak

+0

Что вы предлагаете мне сделать с этой защитной мерой? –

+0

Я думал, что так сказал. – Tomalak

ответ

3

Изменить сущность ограничения расширения с параметром JVM:

-DentityExpansionLimit=1000000 
+0

как это сделать? –

+0

Зависит от того, как вы запускаете свою программу. Это параметр командной строки. – Necreaux

+0

этот пост http://stackoverflow.com/questions/29360901/getting-parent-child-hierarchy-in-sax-xml-parser содержит мой код для парсера, надеюсь, вы понимаете, как я с ним справляюсь –

0

Вы также можете думать об использовании StAX.

SAX управляется событиями и является серийным. Он может обрабатывать большие XML, но требует много ресурсов ЦП.

DOM берет полный документ в памяти.

StAX - это новейший API. Он транслируется по XML. Его можно рассматривать как курсор или итератор над документом. Преимущество состоит в том, что вы можете пропустить элементы, которые вам не нужны (атрибуты, теги, ...). При правильном использовании он потребляет намного меньше ресурсов ЦП.

https://docs.oracle.com/javase/tutorial/jaxp/stax/why.html

С SAX, то XML раздвинуть события.

С помощью StAX вы тянете за собой XML.

+0

Означает ли это, что все мои усилия по созданию парсера (с использованием SAX), которые действительно хорошо работают для файлов меньшего размера, теряются? –

+0

Нет. Вы можете придерживаться SAX, если исправили проблему. Я просто хотел сообщить вам, что есть еще один современный метод анализа XML.Еще одно преимущество: с SAX u можно разбирать только XML, а StAX u также может писать XML. –

+0

все в порядке, но у меня пока нет никаких исправлений. –

Смежные вопросы