Цитата(mes @ 25.7.2009, 18:40 ) | вот тут многоразовый вызов виртуального метода custom. Хотя достаточно сделать виртуальным parse (), |
Я на это пойтить не могу, смысл всего в том, чтобы избежать дублирования кода. Если я сделаю parse() виртуальным, то мне придется в 20 классах дублировать цикл for().
Ладно, может быть тогда посоветуете какой-нибудь другой способ, чтобы избежать такого:
Код | void Tag1() { while(!atEnd) { ... } }
void Tag2() { while(!atEnd) { ... } }
void Tag3() { while(!atEnd) { ... } }
void Tag4() { while(!atEnd) { ... } }
|
Пытаюсь написать класс, который было бы удобно использовать с StAX xml парсером, но если брать во внимание саму технологию, то отпарсить сложный xml файл с большой глубиной уровней задача не из легких.
Ссылка для ознакомления: http://www.devx.com/Java/Article/30298/0/page/2 - статья про StAX в Java
А это то, как выглядит парсинг xml'я простой структуры, всего 3 вложенных цикла while. У меня же этих циклов намного больше.
Код | QXmlStreamReader xml(data); while (!xml.atEnd()) { xml.readNext(); if (xml.tokenType() == QXmlStreamReader::StartElement) { if (xml.name() == "city") { city = GET_DATA_ATTR; setWindowTitle(city); } if (xml.name() == "unit_system") unitSystem = xml.attributes().value("data").toString(); // Parse current weather conditions if (xml.name() == "current_conditions") { while (!xml.atEnd()) { xml.readNext(); if (xml.name() == "current_conditions") break; if (xml.tokenType() == QXmlStreamReader::StartElement) { if (xml.name() == "condition") { m_conditionItem->setPlainText(GET_DATA_ATTR); } if (xml.name() == "icon") { QString name = extractIcon(GET_DATA_ATTR); if (!name.isEmpty()) { delete m_iconItem; m_iconItem = new QGraphicsSvgItem(name); m_scene.addItem(m_iconItem); m_iconItem->setParentItem(m_statusItem); } } if (xml.name() == "temp_c") { QString s = GET_DATA_ATTR + QChar(176); m_temperatureItem->setPlainText(s); } } } } // Parse and collect the forecast conditions if (xml.name() == "forecast_conditions") { QGraphicsTextItem *dayItem = 0; QGraphicsSvgItem *statusItem = 0; QString lowT, highT; while (!xml.atEnd()) { xml.readNext(); if (xml.name() == "forecast_conditions") { if (dayItem && statusItem && !lowT.isEmpty() && !highT.isEmpty()) { m_dayItems << dayItem; m_conditionItems << statusItem; QString txt = highT + '/' + lowT; QGraphicsTextItem* rangeItem; rangeItem = m_scene.addText(txt); rangeItem->setDefaultTextColor(textColor); m_rangeItems << rangeItem; QGraphicsRectItem *box; box = m_scene.addRect(0, 0, 10, 10); box->setPen(Qt::NoPen); box->setBrush(Qt::NoBrush); m_forecastItems << box; dayItem->setParentItem(box); statusItem->setParentItem(box); rangeItem->setParentItem(box); } else { delete dayItem; delete statusItem; } break; } if (xml.tokenType() == QXmlStreamReader::StartElement) { if (xml.name() == "day_of_week") { QString s = GET_DATA_ATTR; dayItem = m_scene.addText(s.left(3)); dayItem->setDefaultTextColor(textColor); } if (xml.name() == "icon") { QString name = extractIcon(GET_DATA_ATTR); if (!name.isEmpty()) { statusItem = new QGraphicsSvgItem(name); m_scene.addItem(statusItem); } } if (xml.name() == "low") lowT = toCelcius(GET_DATA_ATTR, unitSystem); if (xml.name() == "high") highT = toCelcius(GET_DATA_ATTR, unitSystem); } } }
} }
|
|