crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Как писать парсер для XML?, С чего начинать?
QMainWindow
  опции профиля:
сообщение 29.7.2011, 17:41
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Привет!
Вопрос в сабже. В начале сделал, как в примерах показано (DOM BookMarks) - открытие файла; проверка, является ли файл xml'евским с нужной версией. А как дальше делать, чтобы он распознавал тэги? В QtXml столько классов... QDomDocument вроде ясно зачем. А Node, Element и тд - куда они?

PS Туториал есть по этому?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 29.7.2011, 18:22
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


http://doc.qt.nokia.com/latest/qdomdocument.html#details

Там есть код с примером.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 29.7.2011, 20:20
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Посмотрел. Но там получается, что в консоль выводятся только тэги на одном уровне. А что делать с теми, что вложены в них? Или делать тоже самое, но для вложенных? А не проще просканировать все подряд? Я же не знаю, сколько уровней в файле.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 29.7.2011, 20:51
Сообщение #4


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Раскрывающийся текст
#include <QtCore/QCoreApplication>
#include <QtXml>
#include <QtDebug>

void getChilds(QDomNode node);

QDomDocument inputDom;

int main()
{
  // этот кусок открывает и загружает файл
  // путь к вашему svg
  //QFile *inputFile = new QFile("/media/data/Additional/Programing/svg_optimizer_cli/Kanbaru.svg");
  QFile *inputFile = new QFile("/media/data/Additional/Programing/svg_optimizer_cli/temp.xml");
  inputFile->open(QFile::ReadOnly);
  QTextStream *textStream = new QTextStream(inputFile);
  QString inputString = textStream->readAll();
  inputDom.setContent(inputString);

  // получаем список всех корневых узлов
  QDomNodeList nodeList = inputDom.childNodes();
  for (int i = 0; i<nodeList.count(); ++i) {

    // удаляем Processing Instruction
    // aka <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    if (nodeList.at(i).isProcessingInstruction())
      inputDom.removeChild(nodeList.at(i));

    // удаляем любые коменты
    if (nodeList.at(i).isComment())
      inputDom.removeChild(nodeList.at(i));

    // если у узла есть наследники, просматриваем их все
    if (nodeList.at(i).hasChildNodes())
      getChilds(nodeList.at(i));
  }

  // поиск узлов по названию
  QDomNodeList nodeList2 = inputDom.elementsByTagName("path");
  for (int i = 0; i<nodeList2.count(); ++i) {
    //
    //qDebug()<<nodeList2.at(i).toElement().attribute("style");
    //nodeList2.at(i).toElement().removeAttribute("style");
  }

  // выводим все что осталось
  qDebug()<<inputDom.toString();

  return 0;
}

// рекурсивно просматриваем все узлы
// и удаляем коменты, где бы они не находились
void getChilds(QDomNode node)
{
  if (node.hasChildNodes()) {
    QDomNodeList tempNodeList = node.childNodes();
    for (int i = 0; i<tempNodeList.count(); ++i) {
      // удаляем любые коменты
      if (tempNodeList.at(i).isComment()) {
        node.removeChild(tempNodeList.at(i));
      } else if (tempNodeList.at(i).hasChildNodes()) {
        // если у текущего узла есть наслденики, просматриваем их
        getChilds(tempNodeList.at(i));
      }
    }
  }
}

Как то так.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 29.7.2011, 22:31
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, буду разбираться.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 30.7.2011, 18:50
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


Возникла проблема.
Есть, например, три самых верхних тэга: title, section, section (никаких head, body или других, что могли бы стоять выше). Для просмотра в глубину каждого из них использую вышеуказанную рекурсию. Предположим, вся ветка title просмотрена и наша функция переходит к просмотру потомков у второго тэга. Вопрос: как определить этот момент?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 30.7.2011, 19:29
Сообщение #7


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


void getChilds(QDomNode node)
{
  qDebug()<<node.nodeName();
  ...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 30.7.2011, 20:17
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(QMainWindow @ 30.7.2011, 21:50) *
Есть, например, три самых верхних тэга: title, section, section (никаких head, body или других, что могли бы стоять выше)

на самом деле, это несоответствие стандарту XML. так что многие парсеры будут ругаться. лучше всё же делать единый корень у всего документа.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
QMainWindow
  опции профиля:
сообщение 30.7.2011, 20:24
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 1.8.2010
Пользователь №: 1922

Спасибо сказали: 0 раз(а)




Репутация:   0  


А, я видать не написал. Те 3 тэга - это пример. На самом деле мы не знаем, как конкретно называются все верхние тэги (и их количество), все они записаны в сам xml файл. Может есть какой-нибудь метод для определения самого верхнего родителя ака getTopDomNode()?
Определить этот момент нужно не для меня, а для программы, т.к. в именно этот момент ей нужно очистить два векторных массива.


Корень изначально единый, просто в самом доке идут следующие подуровни, которые нужно по-разному обрабатывать (т.е. есть несколько методов).

Сообщение отредактировал QMainWindow - 30.7.2011, 20:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.7.2011, 9:50
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


примеры смотри
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 22:31