Russian Qt Forum

Qt => XML => Тема начата: KosToZyB от Декабрь 26, 2010, 22:45



Название: [Решено] чтение значение тэга
Отправлено: KosToZyB от Декабрь 26, 2010, 22:45
Здравствуйте, есть такой xml файл:
Код:
<testing>
<subject>
<question>"qustion 1"</question>
<bool_answer>false</bool_answer>
<answer>"1 answer"</answer>
<answer>"2 answer"</answer>
<answer>"3 answer"</answer>
<answer>"4 answer"</answer>
<correctly_answer>"2"</correctly_answer>
</subject>
<subject>
<question>"qustion 2"</question>
<bool_answer>false</bool_answer>
<answer>"1 answer"</answer>
<answer>"2 answer"</answer>
<answer>"3 answer"</answer>
<answer>"4 answer"</answer>
<correctly_answer>"2"</correctly_answer>
</subject>
</testing>
Код:
Цитировать
xmlStreamReaderDatabase = new QXmlStreamReader();
xmlStreamReaderDatabase->setDevice(&file);
   while (!xmlStreamReaderDatabase->atEnd()) {
      xmlStreamReaderDatabase->readNext();
      if (xmlStreamReaderDatabase->isStartElement()){
         qDebug() << xmlStreamReaderDatabase->name(); //считываю имя атрибута
      }
   }
Как считать значение атрибута? т.е. то, что находится между допустим атрибутами <answer> и </answer>?
P.S.
может xml файл структурирован не верно?


Название: Re: чтение значение тэга
Отправлено: ecspertiza от Декабрь 26, 2010, 23:21
readElementText()


Название: Re: чтение значение тэга
Отправлено: KosToZyB от Декабрь 26, 2010, 23:30
после
Код:
qDebug() << xmlStreamReaderDatabase->name();
добавляю
Код:
qDebug() << xmlStreamReaderDatabase->readElementText();
выводит:
Код:
"testing" 
"
"


Название: Re: чтение значение тэга
Отправлено: ecspertiza от Декабрь 27, 2010, 09:14
ф-ция readElementText() грубо говоря читает текст между тегами, но если есть вложенные теги тогда читать нужно по другому.

псевдо код:
Код:
while(!atEnd())
{
  if (isEndElement())
    break;

  if (isStartElement())
  {
     if (name() == "testing")
     {
          while(!atEnd())
          {
             if (isEndElement())
             break;

             if (isStartElement())
             {
                  if (name() == "subject")
                  {
                      while(!atEnd())
                      {
                          if (isEndElement())
                          break;

                          if (isStartElement())
                          {
                              if (name() == "question")
                              {
                                   readElementText();
                              }else if (name() == "bool_answer")
                              {
                                   readElementText();
                              }      //и так далее
                          }
                      }
                  }
             }
          }
     }
  }
}




Название: Re: чтение значение тэга
Отправлено: ufna от Декабрь 27, 2010, 09:29
Экспертиза, это "О_О". Такие вопросы решаются немного другими путями :0)


Название: Re: чтение значение тэга
Отправлено: ecspertiza от Декабрь 27, 2010, 09:52
писал в торопях так что сильно не ругайте :) обычно я это все дело еще и на процедуры разделяю, для удобства, каждая процедура с вой тег читает ну если он не последний :) кстати если есть более красивое решение с радостью выслушаю  ;)


Название: Re: чтение значение тэга
Отправлено: deaks от Декабрь 27, 2010, 12:11
может вам стоит заюзать dom или sax, чем возиться с этим построчным считыванием


Название: Re: чтение значение тэга
Отправлено: SASA от Декабрь 27, 2010, 15:02
может вам стоит заюзать dom или sax, чем возиться с этим построчным считыванием
+1. Но есть одно но. Размер исходного файла. Если < 10 Мб, то смело юзайте dom. Если больше - надо смотреть сколько работает функция QDomDocument::setContent.


Название: Re: чтение значение тэга
Отправлено: KosToZyB от Декабрь 27, 2010, 18:13
всем спасибо. Да вчера ночью dom и заюзал)) не было времени с QXmlStreamReader разбираться, я думал что он проще, оказалось не совсем так)


Название: Re: чтение значение тэга
Отправлено: ufna от Декабрь 27, 2010, 18:41
Есть такая классная штука как XQuery (или чет такое по названию)