Я работаю над утилитарным методом, который позволяет преобразовывать данные XML в форматированные String
, и, прежде чем вы подумаете, это тривиальная задача для javax.xml.transform.Transformer
, позвольте мне объяснить конкретные ограничения, с которыми я столкнулся.
Входные данные не существуют на момент начала преобразования.На самом деле это представлен как groovy.lang.Writeable
( javadoc ) экземпляр, который я мог бы вывести в любой экземпляр java.io.Writer
.Подпись метода выглядит следующим образом:
static String serializeToString(Writable source)
Мое текущее решение состоит из нескольких шагов и фактически обеспечивает ожидаемый результат:
- Создайте
StringWriter
, выведите source
и конвертируйте вString
- Создать
javax.xml.transform.stream.StreamSource
экземпляр на основе этой строки (используя StringReader
) - Создать новый
StringWriter
экземпляр и обернуть его в javax.xml.transform.stream.StreamResult
- Выполнитьпреобразование с использованием экземпляра
javax.xml.transform.Transformer
- Преобразование
StringWriter
в String
Пока решение работает, я не доволен его эффективностью.Этот метод будет использоваться очень часто, и я хочу его оптимизировать.Чего я хотел бы избежать, так это необходимости выполнять несколько преобразований вдоль линии:
- От
Writeable
до String
(неформатировано) - От
String
до StreamSource
(что означает, что данные будут снова проанализированы) - С
StreamSource
до String
снова (отформатировано)
Так что вопрос в том, возможно ли построить подобный трубепоток, который исключает ненужные преобразования?
ОБНОВЛЕНИЕ № 1:
Чтобы дать немного больше контекста, я преобразую экземпляр GPathResult
в форматированную строку, используя StreamingMarkupBuilder.bindNode()
метод, который производит Writable
экземпляр.К сожалению, нет способа указать StreamingMarkupBuilder
для получения форматированного вывода.
ОБНОВЛЕНИЕ № 2:
Я экспериментировал с реализацией, основанной на PipedWriter + PipedReader, но эксперименты нене показывать большой выигрыш в скорости от этого подхода.Похоже, в данном случае это не так критично.