Эффективный способ преобразования XML-данных, представленных как записываемые - PullRequest
0 голосов
/ 04 апреля 2011

Я работаю над утилитарным методом, который позволяет преобразовывать данные XML в форматированные String, и, прежде чем вы подумаете, это тривиальная задача для javax.xml.transform.Transformer, позвольте мне объяснить конкретные ограничения, с которыми я столкнулся.

Входные данные не существуют на момент начала преобразования.На самом деле это представлен как groovy.lang.Writeable ( javadoc ) экземпляр, который я мог бы вывести в любой экземпляр java.io.Writer.Подпись метода выглядит следующим образом:

static String serializeToString(Writable source)

Мое текущее решение состоит из нескольких шагов и фактически обеспечивает ожидаемый результат:

  1. Создайте StringWriter, выведите source и конвертируйте вString
  2. Создать javax.xml.transform.stream.StreamSource экземпляр на основе этой строки (используя StringReader)
  3. Создать новый StringWriter экземпляр и обернуть его в javax.xml.transform.stream.StreamResult
  4. Выполнитьпреобразование с использованием экземпляра javax.xml.transform.Transformer
  5. Преобразование StringWriter в String

Пока решение работает, я не доволен его эффективностью.Этот метод будет использоваться очень часто, и я хочу его оптимизировать.Чего я хотел бы избежать, так это необходимости выполнять несколько преобразований вдоль линии:

  1. От Writeable до String (неформатировано)
  2. От String до StreamSource (что означает, что данные будут снова проанализированы)
  3. С StreamSource до String снова (отформатировано)

Так что вопрос в том, возможно ли построить подобный трубепоток, который исключает ненужные преобразования?

ОБНОВЛЕНИЕ № 1:

Чтобы дать немного больше контекста, я преобразую экземпляр GPathResult в форматированную строку, используя StreamingMarkupBuilder.bindNode() метод, который производит Writable экземпляр.К сожалению, нет способа указать StreamingMarkupBuilder для получения форматированного вывода.

ОБНОВЛЕНИЕ № 2:

Я экспериментировал с реализацией, основанной на PipedWriter + PipedReader, но эксперименты нене показывать большой выигрыш в скорости от этого подхода.Похоже, в данном случае это не так критично.

1 Ответ

1 голос
/ 04 апреля 2011

Не зная, что именно вы подразумеваете под «данными XML», но вы могли бы подумать о представлении материала «все еще быть» непосредственно как SAXSource, тем самым пропуская «to-string» и «parse-string»шаги

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...