| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Вопрос про XML |
| Автор: DCamer 7.7.2011, 21:19 | ||
Здравствуйте. Есть программа, работающая с XML-документами, нужно сделать так, чтобы программа читал определённый, выбранный в самый программе узел. Например, в XML-документе есть такие данные:
А в программе есть окно выбора ID вопроса, и нужно чтобы, если пользователем выберет, скажем ID 2, загрузился второй вопрос. Подскажите пожалуйста, как такое сделать? |
| Автор: xvr 8.7.2011, 16:57 |
| Загрузить XML в DOM дерево, потом пройти по нему и найти нужный элемент. Или вопрос в чем то другом? |
| Автор: Cheloveck 8.7.2011, 17:27 |
| xvr, тут лучше SAX, а не DOM. DCamer, парсеры SAX работают на колбеках. Ты говоришь ему распарсить документ/файл/поток, он при нахождении каждого тега вызывает колбек и передаёт имя тега и список пар атрибут-значение. Тебе остаётся лишь дождаться нужного колбека и загрузить нужную инфу, после чего сказать парсеру остановиться. По сравнению с DOM SAX парсеры не требовательны к памяти, то есть ты сможешь обрабатывать файлы хоть по терабайту. И самому выискивать ничего не нужно, тебе всё на блюдечке принесут. Не знаю, есть ли а VCL SAX парсер, но http://www.xmlsoft.org/точно всё это умеет. Кроме того, у libxml есть http://libxmlplusplus.sourceforge.net/ |
| Автор: DCamer 8.7.2011, 19:02 |
По значению атрибута? Суть в том, что ID собираются из самого XML-документа. Относительно требовательности, не суть важно. XML-документы больше 1 МБ в моём случае не бывают. |
| Автор: xvr 8.7.2011, 19:47 |
| Да Это чему то противоречит? Тогда уж вам больше подойдет StAX парсер (видел на sourceforge проект lsxml - очень маленький и простой a-la StAX парсер). У SAX довольно много писанины для подключения колбэков. Код с использованием DOM парсера получается компактнее |
| Автор: DCamer 8.9.2011, 21:17 |
| К сожалению, не смог найти методы работы, как с SAX-, так и DOM-парсерами. |
| Автор: xvr 8.9.2011, 21:35 | ||
Для DOM: Загружаете XML (функция XMLDocument() и метод Load()), потом перебираете все items верхнего уровня и ищите среди них item с тэгом Question. Проверяете у них атрибут id на требуемое значение |
| Автор: DCamer 8.9.2011, 21:41 |
В этом основная проблема, не могу понять как проверить атрибут этот. |
| Автор: DCamer 9.9.2011, 19:26 | ||||
Ошибка:
К тому же, окно выбора ID — модальное окно. |
| Автор: xvr 9.9.2011, 19:59 | ||
Ну так приведите ему тип, что бы понял:
Ну и что? В чем проблема передать id из этого окна? |
| Автор: DCamer 9.9.2011, 20:47 | ||||
| Странно, выбираю ID, но загружается первый Question. Вот, листинг:
|
| Автор: xvr 10.9.2011, 11:40 |
| Ваш if (nodElementb->NodeType ==ntElement && nodElementb->NodeName == "Question" && nodElementb->GetAttribute("id") == id ) должен находится в цикле. Сейчас у вас извлекается первый же Question, и если так совпало, что ID у него соответствует, то он и загружается, а если ID не совпало, то ничего не меняется - т.е. остается первый загруженный (с прошлого раза) |
| Автор: DCamer 16.9.2011, 16:35 |
Так он находится в цикле Try. |
| Автор: xvr 16.9.2011, 20:40 | ||
Я вас неприятно обрадую, но try -это не цикл, это блок. Он выполняется только 1 раз |
| Автор: DCamer 17.9.2011, 18:06 |
| Все варианты перепробывал, результат нулевой. |
| Автор: xvr 18.9.2011, 09:51 | ||
|
| Автор: DCamer 12.11.2011, 17:21 |
| Спасибо! |