2015-04-30 4 views
2

Мое приложение создает очень большой XML-файл (около 300 000 транзакций). Каждая транзакция будет содержать около 20 элементов xml. Таким образом, он создает огромный XML-файл. Мы не использовали JAXB или SAX или DOM для создания xml-файла, поскольку память является ограничением. Теперь мне нужно заменить определенные значения тегов в xml-файле после его создания. Я знаю, что нужно заменить, и значение, которое нужно заменить. Как я могу заменить эти переменные без загрузки всего файла в память? Для транзакций 300K размер файла составляет около 600 МБ. Поэтому мы не хотим загружать весь файл в память для замены нескольких переменных.Как заменить строку в файле xml без загрузки содержимого файла в память в java?

Мы используем Java5. Есть ли способ, которым мы можем это сделать?

ответ

1

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

Более подробную информацию о том, что процесс - http://docs.oracle.com/javaee/5/tutorial/doc/bnbfl.html#bnbgq

Мне нравится, как Стивен C решает вашу проблему в ответ здесь - How to modify a huge XML file by StAX?

1

Вы можете попробовать преобразование потокового с помощью XSLT 3.0 (в частности, Saxon-EE) ,

Я не уверен, что вы подразумеваете под «значениями тега» (это намного проще, если люди используют правильную терминологию ...), но если вы имеете в виду значения текстовых узлов, то вы можете написать потоковое преобразование что-то например:

<xsl:mode streamable="yes" on-no-match="shallow-copy"/> 

<xsl:template match="xyz/text()[.='old value']"> 
    <xsl:text>new value</xsl:text> 
</xsl:template> 

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

+0

Спасибо michael..by значение тега i означало значение текстового узла ... это новая вещь, которую вы предложили ... давайте попробовать ... но новое значение будет меняться в зависимости от некоторой бизнес-логики времени исполнения. . Я не могу поместить его в xsl..когда как я это делаю? –

+0

Всегда можно вызывать код XSLT на Java, хотя это не обязательно так часто, как люди думают, потому что логика обычно может быть написана в XSLT так же легко. –

2

Вы можете попробовать VTD-XML:

  • памяти эффективным (1.3x ~ 1.5x размер документа XML) случайным образом -access XML-парсер.
  • Самый быстрый XML-синтаксический анализатор: на рабочем столе Core2 2.5Ghz VTD-XML превосходит DOM-парсеры на 5x ~ 12x, обеспечивая 150 ~ 250 МБ/с на постоянную пропускную способность ядра.
  • Инкрементный анализатор XML, способный выполнять резку, склеивание, разбиение и сборку XML-документов с максимальной эффективностью.
  • Доступен в C, C++, C# и Java.

Example modifying XML.