пайпинг двух саксофонных парсеров? - PullRequest
1 голос
/ 14 ноября 2011

У меня есть следующая задача по реализации, и я не знаю, как ее решить.

У нас есть синтаксическая проверка на основе SAX для формата xml, который проверяет хэш-сумму в некотором закрывающем endElement (). Эта хеш-сумма построена с использованием своего рода фильтрации InputStream , которая обновляет MessageDigest при чтении содержимого. SAX-syntaxchecker использует этот входной поток в качестве своего InputSource.

Проблема (моя задача) заключается в том, что хеш-сумма должна быть построена на некоторых канонизированных частях входного xml (см. http://www.w3.org/TR/xml-c14n).

Теперь сложная вещь: у нас есть Canonicalizer, который также использует SAX для канонизации ввода. (Необходимо учитывать текущий контекст, чтобы различать атрибуты, узлы и т. Д., Поэтому мы используем SAX)

Я хочу повторно использовать этот Canonicalizer, но не вижу способа объединить эти два SAX-парсера.

Я думаю, я хочу какой-то конвейер:

InputFile -> Canonicalizer -> HashCalculation-InputStream -> SyntaxChecker.

Есть идеи / рекомендации, как этого добиться? ТИА.

1 Ответ

0 голосов
/ 14 ноября 2011

Поскольку вычисление хеша считывается из входного потока, результат канонизации должен в конечном итоге быть представлен как входной поток. Вы можете использовать PipedInputStream, подключенный к PipedOutputStream, или пару ByteArrayOutputStream / ByteArrayInputStream через временный байтовый массив.

Вместо этого, если бы два компонента были разработаны с учетом облицовки труб, вы могли бы использовать org.xml.sax.XmlFilter для соединения событий из канонизатора с обработчиком вычисления хеша / проверки синтаксиса

...