![]() |
|
![]() ![]() ![]() |
|
DCamer |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
Здравствуйте. Есть программа, работающая с XML-документами, нужно сделать так, чтобы программа читал определённый, выбранный в самый программе узел. Например, в XML-документе есть такие данные:
А в программе есть окно выбора ID вопроса, и нужно чтобы, если пользователем выберет, скажем ID 2, загрузился второй вопрос. Подскажите пожалуйста, как такое сделать? ![]() Это сообщение отредактировал(а) DCamer - 7.7.2011, 21:22 --------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Загрузить XML в DOM дерево, потом пройти по нему и найти нужный элемент. Или вопрос в чем то другом?
|
|||
|
||||
Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 1 Всего: 32 |
xvr, тут лучше SAX, а не DOM.
DCamer, парсеры SAX работают на колбеках. Ты говоришь ему распарсить документ/файл/поток, он при нахождении каждого тега вызывает колбек и передаёт имя тега и список пар атрибут-значение. Тебе остаётся лишь дождаться нужного колбека и загрузить нужную инфу, после чего сказать парсеру остановиться. По сравнению с DOM SAX парсеры не требовательны к памяти, то есть ты сможешь обрабатывать файлы хоть по терабайту. И самому выискивать ничего не нужно, тебе всё на блюдечке принесут. Не знаю, есть ли а VCL SAX парсер, но libxml точно всё это умеет. Кроме того, у libxml есть бинд на C++ -------------------- ![]() |
|||
|
||||
DCamer |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
По значению атрибута? Суть в том, что ID собираются из самого XML-документа. Относительно требовательности, не суть важно. XML-документы больше 1 МБ в моём случае не бывают. ![]() --------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Да
Это чему то противоречит? Тогда уж вам больше подойдет StAX парсер (видел на sourceforge проект lsxml - очень маленький и простой a-la StAX парсер). У SAX довольно много писанины для подключения колбэков. Код с использованием DOM парсера получается компактнее |
|||
|
||||
DCamer |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
К сожалению, не смог найти методы работы, как с SAX-, так и DOM-парсерами.
![]() ![]() --------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Для DOM: Загружаете XML (функция XMLDocument() и метод Load()), потом перебираете все items верхнего уровня и ищите среди них item с тэгом Question. Проверяете у них атрибут id на требуемое значение |
|||
|
||||
DCamer |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
В этом основная проблема, не могу понять как проверить атрибут этот. --------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
DCamer |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
Ошибка:
К тому же, окно выбора ID — модальное окно. Это сообщение отредактировал(а) DCamer - 9.9.2011, 19:42 --------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
DCamer |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
Странно, выбираю ID, но загружается первый Question.
Вот, листинг:
--------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
Ваш if (nodElementb->NodeType ==ntElement && nodElementb->NodeName == "Question" && nodElementb->GetAttribute("id") == id ) должен находится в цикле. Сейчас у вас извлекается первый же Question, и если так совпало, что ID у него соответствует, то он и загружается, а если ID не совпало, то ничего не меняется - т.е. остается первый загруженный (с прошлого раза)
|
|||
|
||||
DCamer |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 232 Регистрация: 29.1.2010 Репутация: нет Всего: нет |
--------------------
Нуб! Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |