2014-02-17 6 views
1

Итак, я искал, но не смог найти ответ.Формат Delphi FormatXMLData вызывает EOutOfMemory

В SOF возникает вопрос о создании большого XML-кода, вызывающего исключение из памяти, но это не мой случай.

Я создаю XML, используя IXMLDocument через привязку данных XML, и он создан просто отлично.

Но при сохранении файла в файл все это в одной строке текста. Путь к передаче XML через FormatXMLData перед сохранением его в файл.

Это отлично работает на небольших файлах, но с EOutOfMemory падает, если XML достаточно велик.

Поэтому я попытался добавить параметр [doNodeAutoIndent], но не работал.

Следующий шаг, я создал TStringList для получения XML, чтобы я мог деактивировать IXMLDocument, а затем попробовать FormatXMLData в TSringList. Я не ожидал многого из этого, но я полагаю, что, возможно, эти два компонента используют другой менеджер памяти (я ошибаюсь, полагая, что IXMLDocument использует диспетчер памяти COM вместо Delphi?), И реальность оказалась настолько близкой к ожиданиям, что и одно и то же исключение был поднят.

Кто-нибудь имеет представление о том, как сохранить сохраненный xml правильно отформованный и сформованный при использовании привязки данных XML, либо с помощью FormatXMLData, либо любым другим вариантом?

Чтение подобных вопросов здесь, в StackOverFlow, я увидел некоторые альтернативы, включая SAX-парсер, чтобы заменить DML на основе документа IXMLDocument, но я считаю, что это отключит преимущество привязки данных XML, не так ли?

Спасибо, Нуну

+0

Насколько велика неформатированный XML-документ? – whosrdaddy

+0

Я тестирую с объемом XML-информации объемом 8.5 МБ, но иногда это может быть даже больше ... – nunopicado

ответ

1

Вы не должны заменить DOM парсер с SAX парсер до тех пор, как SAX парсер может обрабатывать строку DOM дерева в качестве входного потока.

Вы также можете реализовать свой собственный форматировщик, основанный на потоках, который требует только отступов/unindent строки, основанной на открытии/закрытии тегов XML-элементов в строке. Это было бы быстро и легко реализовать.

+0

Hi mjn. Спасибо за ответ. Итак, вы предлагаете мне создать XML, используя парсер DOM с привязкой данных XML, а затем передать XML-строку в SAX-парсер или пользовательский индентор, только для форматирования XML, так ли это? Это мысль ... Знаете ли вы какой-либо SAX-парсер (для XE3), который вы могли бы порекомендовать? Я бы хотел проверить этот вариант ... – nunopicado

+1

@nunopicado для SAX с Delphi, см. Http://stackoverflow.com/q/3581520/80901 – mjn

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