| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > SAXXML парсинг |
| Автор: Alexandr87 10.5.2006, 14:02 | ||||
Есть некая xml структура, упрощенно выглядящая так. <request arg='qwerty'> <action arg1='power' arg2='4'> <doc dynArg1='power' dynArg2='clower' /> </action> </request> Теги <request> и <action> - имеют фиксированное число аргументов. Вид (аргументы, внутренние элементы) тега <doc> определяется на основе значения агрументов тега <action>. Предполагалось разбирать данную структуру - двумя парсерами (внутренним и внешним). Внешний парсит нужные агрументы тегов <request> и <action> и на их основе динамически подгружает нужный парсер (внутренний) для анализа внутренней структуры. Парсится InputStream. При создании внешнего Handler а, я передаю ему через конструктор ссылку на этот объект, так, чтобы он мог вызвать внутренний парсер, передав ему данную ссылку для разбора. Но в момент начала работы внутреннего парсера вылетает ошибка java.io.IOException: Bad file descriptor Не могу понять, то ли это SAXParser парсит сразу все, а не постепенно, то ли еще чего. примерный код
ошибка
Заранее благодарен. |
| Автор: kashka 10.5.2006, 14:59 |
| XML файл неправильный. Попробуй ' на " заменить. И проверь dtd файл, может там что не подходит. |
| Автор: Alexandr87 11.5.2006, 04:33 |
| про ddt в моем посте нет ни слова. Он не используется. Какие могут быть альтернативные пути решения задачи. Или она не понятна. |
| Автор: tux 11.5.2006, 04:55 | ||
Возможно возникновение такого исключения если у XML нет заголовка с указанием кодировки (тогда вероятно используется iso-8859-1), но при этом в документе имеются кириллические символы. Если заголовок поставить (если его нет, конечно)?
|
| Автор: Alexandr87 11.5.2006, 17:21 | ||||
итак xml.xml
А это точный код, в котором возникает вышеописанная ситуация.
|
| Автор: LSD 11.5.2006, 22:30 |
| Дык чтож ты хочешь! Ты же в DefaultHandler в обработчике тега, начинаешь парсить этот же файл из того же самого FileInputStream! Естественно он перемещает позицию в файле на конец файла, вот ты и получаешь ошибку. |
| Автор: Alexandr87 12.5.2006, 04:43 |
| Я просто думал - что он парсит файл последовательно - не все сразу, и останавливается на теге - на котором вызывает очередной метод DefaultHandler. А как тогда можно попробовать? |
| Автор: LSD 12.5.2006, 19:33 |
| Никто не может гарантировать, что текущая позиция в InputStream будет соответсвовать тегу, скорее всего нет. Почти наверняка они используют буферизацию. Тем более процесс парсинга SAX парсером не остановить, пока он не дойдет до конца. А зачем это вообще нужно? |
| Автор: Alexandr87 13.5.2006, 14:40 |
| внутренняя часть, динамическая и парсится разными наследниками DefaultHandler, которые при обработке вытягивают нужные данные и записывают их куда следуют, но заранее не известен полный список возможных внутренних (динамических) структур, и в зависимости от значений полученных во внешней структуре, выбирается необходимый класс-парсер, который далее и обрабатывает данный кусок и делает все что на него возложили. Или пояснить более детально? Есть ли альтернативные способы. |
| Автор: LSD 14.5.2006, 01:05 |
Использовать один DefaultHandler, а он в зависимости от полученных данных пусть вызывает соответсвующий обработчкик. Например это можно реализовать так: у умолчального обработчика есть Map в которой записано на каком теге какого обработчика надо вызвать, и есть поле текущий обработчик. Когда приходит тег и для него есть обработчик, то он делается текущим обработчиком. И далее когда происходят SAX события, вызывается именно текущий обработчик. После того как текущий обработчик завершил работу, он разрегистрируется в умолчальном обработчике и тот снова начинает обрабатывать события самостоятельно. P.S. А еще можно сделать не одного текущего обработчика, а стек. |
| Автор: Alexandr87 14.5.2006, 05:44 |
| Спасибо LSD. Что то мне кажется, что так и придется делать. Хотя на мой взгляд, было бы удобнее если можно было запустить еще один парсер. |