![]() |
|
Модераторы: bsa |
![]()
|
|
| webprofusa |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
Добрый день!
Заранее сори, крайне плохо знаю язык и его возможности. Задача Создать многопоточный парсинг xml файлов используя SAX2, при этом без использования сторонних библиотек(только libxml2). Структура xml заранее неизвестна (т.е. фактически перегон xml в массив) Домыслы почитав документацию нашел такой пример:
чтож, здорово) примерно также я делал в php. При этом в классе mySaxParser можно объявить массивы открытых тегов, а также результирующий массив(в который будем сваливать значения тегов при их закрытии в методе endElementNs). Ну и таким образом можно создать достаточно быстрый модуль перегона xml в массив. Все это хозяйство должно работать в много потоков, поэтому конечно нужно для каждого потока создавать свой экземпляр класса mySaxParser, ну и соотвественно устанавливать хендлеры нужных функций именно из созданного экземпляра(чтобы данные парарлельных потоков не перемешивались)... и вот тут начинаются проблемы... Проблемы У меня никак не получается присвоить saxHandler.startElementNs указатель на метод экземпляра класса mySaxParser, пробовал по всякому обгуглился уже в край, ничего не помогает( saxHandler.startElementNs - желает работать только со статическими методами =( Окей, грешен, на всякий случай попробовал использовать статический класс mySaxParser в нескольких потоках, как я и предполагал, значения свойств класса оказались общими между потоками( (т.е. происходило переприсваивание) Вопросы 1) как мне присвоить saxHandler.startElementNs указатель на метод(не статический) экземпляра класса mySaxParser? - это в принципе возможно? 2) возможно можно как-то для разных потоков избжать перприсваивания свойств статического класса? (хотя мозгом понимаю, какая эта глупость, но коль другого выхода нет) Добавлено через 8 минут и 33 секунды Да, вот описание функции saxHandler.startElementNs
|
||||
|
|||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
да вторым параметром функции xmlSAXUserParseMemory передается некий указатель ctx (context). Этот указатель передается в неизменном виде каждой твоей функции, которую вызывает парсер. Таким образом, ты должен сделать статические методы-обертки, которые будут преобразовывать void *ctx в mySaxParser *msp, а затем вызывать уже нестатический метод конкретного объекта. И именно эти обертки присваивать элементам структуры xmlSAXHandler. Пример: http://gaiacrtn.free.fr/articles/libxml2_sax2.html Это сообщение отредактировал(а) bsa - 15.11.2011, 15:45 |
|||
|
||||
| webprofusa |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 29.10.2011 Репутация: нет Всего: нет |
Вау супер!
Спасибо огромное за исчерпывающий ответ) |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
А можно вопрос? В чем глубокий смысл использования SAX, что бы потом все равно загрузить весь xml в память? Почему сразу не взять DOM (или то, что под этим понимает libxml2)? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |