Russian Qt Forum
Ноябрь 23, 2024, 03:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: DOM  (Прочитано 6573 раз)
acidburst
Гость
DOM
« : Декабрь 03, 2011, 20:49 »

Доброе время суток.

Посмотрите пожалуйста, попытался написать свой первый небольшой парсер.
Но чето мне кажется совершенно не разумно он написан, но работает

Код
C++ (Qt)
   QDomNode node = root.firstChild();
   while (!node.isNull())
   {
       QDomElement element = node.toElement();
       if (node.toElement().tagName() == "currentTime")
       {
           qDebug() <<"currentTime: " << element.text();
       }
       else if (node.toElement().tagName() == "cachedUntil")
       {
           qDebug() << element.tagName() << " " << element.text();
       }
       else if (node.toElement().tagName() == "result")
       {
           qDebug() << element.tagName();
           QDomNode firstChildNode = node.firstChild();
           while  (!firstChildNode.isNull())
           {
               QDomElement secondElement = firstChildNode.toElement();
               if (firstChildNode.toElement().tagName() == "rowset")
               {
                   qDebug() << secondElement.tagName() << " " << secondElement.attribute("name");
                   QDomNode secondChildNode = firstChildNode.firstChild();
                   while (!secondChildNode.isNull())
                   {
                       QDomElement thirdElement = secondChildNode.toElement();
                       if (secondChildNode.toElement().tagName() == "row")
                       {
                           qDebug() << thirdElement.tagName();
                               qDebug () <<thirdElement.attribute ("name") << " " <<
                                           thirdElement.attribute("characterID") << " " <<
                                           thirdElement.attribute("corporationName") << " " <<
                                           thirdElement.attribute ("corporationID");
                           secondChildNode = secondChildNode.nextSibling();
                       }
                   }
               }
               firstChildNode = firstChildNode.nextSibling();
           }
       }
       node= node.nextSibling();
   }

сама xml-ка
Код
XML
<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
 <currentTime>2012-07-13 14:07:53</currentTime>
 <result>
   <rowset name="characters" key="characterID" columns="name,characterID,corporationName,corporationID">
     <row name="sotona" characterID="9999999999" corporationName="paravoz" corporationID="88888888" />
   </rowset>
 </result>
 <cachedUntil>2012-07-13 15:04:53</cachedUntil>
</eveapi>

че тут не так, может кто подскажет?
и еще, как лучше передавать результаты, переменными, либо массивом каким...?
Записан
trot
Гость
« Ответ #1 : Декабрь 04, 2011, 12:23 »

Почему не разумно?

Сама структура документа вся хранится в памяти, поэтому можно сразу адресоваться к нужному тэгу, если  у него задан Id, или отобрать все тэги с определенным именем, если имя тэга уникально, то соответственно будет найден один узел. Может нет особого смысла перебирать тэги, путем обхода структуры документа, чтобы найти нужный и это вы считаете не разумным подходом.
Записан
acidburst
Гость
« Ответ #2 : Декабрь 04, 2011, 12:37 »

Неразумным я посчитал то, что количество текста на парсер превышает количество в самом xml файле. А так да, мне все не нужно, нужно лишь значения row и cachedUntil. Но так как это мой первый опыт, захотел посмотреть все.

Может быть както разумнее при парсинге всей xml-ки пользоваться рекурсией, или я не знаю, какойто другой волшебной палочкой или бубен какой существует хороший, проверенный.
Записан
Bepec
Гость
« Ответ #3 : Декабрь 05, 2011, 07:31 »

Есть стандартный Qt парсер DOM.
QXmlDefaultHandler.

Подстраивается как тебе удобно, сам пользовался пару раз (просто тестировал его).
Записан
acidburst
Гость
« Ответ #4 : Декабрь 09, 2011, 08:42 »

Есть стандартный Qt парсер DOM.
QXmlDefaultHandler.

Подстраивается как тебе удобно, сам пользовался пару раз (просто тестировал его).
можно ли где-то посмотреть пример его использования?
Записан
Bepec
Гость
« Ответ #5 : Декабрь 09, 2011, 08:54 »

Qt\4.7.2\examples\xml\saxbookmarks\

В примерах лежит, раздел XML. Так же ассистант имеет целую статью по нему.

На первый взгляд слишком громоздко, много непонятного, но вникнув можно в принципе парсить всё.

PS пытался им парсить страницы ботом. Потом оказалось, что для этих целей JavaScript лучше.
Записан
acidburst
Гость
« Ответ #6 : Декабрь 10, 2011, 10:15 »

Я может что-то не правильно понимаю, но sax как бэ не тоже самое что и dom на мой взгляд.
Тут точно нет ошибки?
Записан
Bepec
Гость
« Ответ #7 : Декабрь 13, 2011, 07:50 »

Дом в принципе та же последовательная структура. Не спорю, что для его работы нужно чуть чуть изменить, но в результате это будет лучше, чем ничего Улыбающийся
Записан
trot
Гость
« Ответ #8 : Декабрь 13, 2011, 18:11 »

Технология SAX и DOM парсинга XML документа отличаются друг от друга тем, что первая открывает XML файл и последовательно перебирает теги, а вторая закачивает весь  XML документ в память и строит его DOM модель, что позволяет далее сразу находить нужный тег. Если вам нужно перебрать все теги, то первый способ это сделает быстрее, а если вы хотите произвольным образом или выборочно обрабатывать документ, то второй способ более удобен, но в этом случае будьте готовы ожидать определенное время на формирование DOM модели в памяти.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.132 секунд. Запросов: 21.