Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос про XML 
:(
    Опции темы
DCamer
Дата 7.7.2011, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Здравствуйте. Есть программа, работающая с XML-документами, нужно сделать так, чтобы программа читал определённый, выбранный в самый программе узел. Например, в XML-документе есть такие данные:
Код

<Question id="1" text="Question 1">
   <Answer text="Answer 1" />
   <Answer text="Answer 2" />
</Question>
<Question id="2" text="Question 2">
   <Answer text="Answer 1" />
   <Answer text="Answer 2" />
</Question>

А в программе есть окно выбора ID вопроса, и нужно чтобы, если пользователем выберет, скажем ID 2, загрузился второй вопрос. Подскажите пожалуйста, как такое сделать?  smile 

Это сообщение отредактировал(а) DCamer - 7.7.2011, 21:22
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 8.7.2011, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Загрузить XML в DOM дерево, потом пройти по нему и найти нужный элемент. Или вопрос в чем то другом?

PM MAIL   Вверх
Cheloveck
Дата 8.7.2011, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 1
Всего: 32



xvr, тут лучше SAX, а не DOM.

DCamer, парсеры SAX работают на колбеках. Ты говоришь ему распарсить документ/файл/поток, он при нахождении каждого тега вызывает колбек и передаёт имя тега и список пар атрибут-значение. Тебе остаётся лишь дождаться нужного колбека и загрузить нужную инфу, после чего сказать парсеру остановиться. По сравнению с DOM SAX парсеры не требовательны к памяти, то есть ты сможешь обрабатывать файлы хоть по терабайту. И самому выискивать ничего не нужно, тебе всё на блюдечке принесут. Не знаю, есть ли а VCL SAX парсер, но libxml точно всё это умеет. Кроме того, у libxml есть бинд на C++


--------------------
user posted image
PM Jabber   Вверх
DCamer
Дата 8.7.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Цитата(xvr @  8.7.2011,  17:57 Найти цитируемый пост)
потом пройти по нему и найти нужный элемент

По значению атрибута? Суть в том, что ID собираются из самого XML-документа.
Цитата(Cheloveck @  8.7.2011,  18:27 Найти цитируемый пост)
По сравнению с DOM SAX парсеры не требовательны к памяти

Относительно требовательности, не суть важно. XML-документы больше 1 МБ в моём случае не бывают. smile 
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 8.7.2011, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DCamer @  8.7.2011,  19:02 Найти цитируемый пост)
По значению атрибута?
Да
Цитата(DCamer @  8.7.2011,  19:02 Найти цитируемый пост)
Суть в том, что ID собираются из самого XML-документа.
Это чему то противоречит?
Цитата(DCamer @  8.7.2011,  19:02 Найти цитируемый пост)
По сравнению с DOM SAX парсеры не требовательны к памяти
Тогда уж вам больше подойдет StAX парсер (видел на sourceforge проект lsxml - очень маленький и простой a-la StAX парсер). У SAX довольно много писанины для подключения колбэков. Код с использованием DOM парсера получается компактнее



PM MAIL   Вверх
DCamer
Дата 8.9.2011, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



К сожалению, не смог найти методы работы, как с SAX-, так и DOM-парсерами. smile  smile 
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 8.9.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DCamer @ 8.9.2011,  21:17)
К сожалению, не смог найти методы работы, как с SAX-, так и DOM-парсерами. smile  smile

Для DOM: Загружаете XML (функция XMLDocument() и метод Load()), потом перебираете все items верхнего уровня и ищите среди них item с тэгом Question. Проверяете у них атрибут id на требуемое значение

PM MAIL   Вверх
DCamer
Дата 8.9.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Цитата(xvr @  8.9.2011,  22:35 Найти цитируемый пост)
Проверяете у них атрибут id на требуемое значение

В этом основная проблема, не могу понять как проверить атрибут этот.
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 9.9.2011, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DCamer @  8.9.2011,  21:41 Найти цитируемый пост)
В этом основная проблема, не могу понять как проверить атрибут этот.

Код

_di_IXMLNode node = ...
int id = ...

if (node->NodeType ==ntElement &&  node->NodeName == "Question" && node->GetAttribute("id") == id)
 {
   ...
 }

PM MAIL   Вверх
DCamer
Дата 9.9.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Цитата(xvr @  9.9.2011,  13:28 Найти цитируемый пост)
node->NodeType ==ntElement &&  node->NodeName == "Question" && node->GetAttribute("id") == id

Ошибка: 
Код

Ambiguity between '_fastcall operator Variant::bool() const' and '_fastcall operator Variant::__int64() const'


К тому же, окно выбора ID — модальное окно.

Это сообщение отредактировал(а) DCamer - 9.9.2011, 19:42
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 9.9.2011, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DCamer @  9.9.2011,  19:26 Найти цитируемый пост)
Ошибка: 

Ну так приведите ему тип, что бы понял:
Код

__int64(node->GetAttribute("id")) == id


Цитата(DCamer @  9.9.2011,  19:26 Найти цитируемый пост)
К тому же, окно выбора ID — модальное окно.

Ну и что? В чем проблема передать id из этого окна?

PM MAIL   Вверх
DCamer
Дата 9.9.2011, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Странно, выбираю ID, но загружается первый Question.
Вот, листинг:
Код

// открытие файла //---------------------------------------------------
void __fastcall TForm1::N5Click(TObject *Sender)
{
   if (OpenDialog1->Execute())
    {
    AnsiString fname = ExtractFileName(OpenDialog1->FileName);
    Form1->Caption = fname + " — Title";
    AnsiString valbt;
    int n;
    _di_IXMLDocument XMLDoct = NewXMLDocument();
    try {
        XMLDoct->LoadFromFile(OpenDialog1->FileName);
        XMLDoct->Active=true;
        XMLDoct->Encoding="UTF-8";
        XMLDoct->Options=XMLDoct->Options << doNodeAutoIndent;
        IXMLNode *nodRootb= XMLDoct->DocumentElement;
        IXMLNode *nodElementb = nodRootb->ChildNodes->FindNode( "Question" );
        IXMLNode *nodEl = nodRootb->ChildNodes->FindNode( "Question" );
        if (nodElementb->NodeType ==ntElement && nodElementb->NodeName == "Question" && nodElementb->GetAttribute("id") == id ) {
            n=nodRootb->ChildNodes->Count;
            cbb1->Clear();
            Memo1->Clear();
            for (int i = 0; i < n; i++) {
                        nodEl = nodRootb->ChildNodes->Nodes[i];
                        AnsiString value= nodEl->GetAttribute("id");
                    cbb1->Items->Add(value);
                }
           valbt = nodElementb->GetAttribute("text");
           Memo1->Lines->Add(valbt);
           if (nodElementb->ChildNodes->Count == 1) {
             Edit1->Clear();
             Memo2->Clear();
                             if (nodElementb) {
                             IXMLNode *child1 = nodElementb->ChildNodes->Get(0);
                             AnsiString ch1 = child1->GetAttribute( "text" );
                                 if (child1->ChildNodes->Count == 2) {
                                   AnsiString ch2 = child1->GetAttribute( "nextQuestion" );
                                 }
                             Memo2->Lines->Add(ch1);
                             Edit1->Text = ch2;
                             }
             Memo3->Lines->Add(ch3);
             }
             twoans->Checked = true;
           }
           }
        }
       }
    __finally { delete XMLDoct;}
  }
}

Код

// при выборе //-------------------------------------------------------------
void __fastcall TForm1::cbb1Select(TObject *Sender)
{
    id = cbb1->SelText;
}

--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 10.9.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Ваш if (nodElementb->NodeType ==ntElement && nodElementb->NodeName == "Question" && nodElementb->GetAttribute("id") == id ) должен находится в цикле. Сейчас у вас извлекается первый же Question, и если так совпало, что ID у него соответствует, то он и загружается, а если ID не совпало, то ничего не меняется - т.е. остается первый загруженный (с прошлого раза)

PM MAIL   Вверх
DCamer
Дата 16.9.2011, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 29.1.2010

Репутация: нет
Всего: нет



Цитата(xvr @  10.9.2011,  12:40 Найти цитируемый пост)
должен находится в цикле

Так он находится в цикле Try.
--------------------
Нуб!   Windows 7 Ultimate x64, Embarcadero RAD Studio 2010 - C++Builder 2010
PM MAIL   Вверх
xvr
Дата 16.9.2011, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 48
Всего: 223



Цитата(DCamer @ 16.9.2011,  16:35)
Цитата(xvr @  10.9.2011,  12:40 Найти цитируемый пост)
должен находится в цикле

Так он находится в цикле Try.

Я вас неприятно обрадую, но try -это не цикл, это блок. Он выполняется только 1 раз

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1055 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.