void RssFetcher::parseXml(QIODevice *device) { QXmlStreamReader xmlReader(device); TagElement currentTag = otherElement; RssItem item; while (!xmlReader.atEnd()) { switch (xmlReader.readNext()) { case QXmlStreamReader::StartElement: currentTag = tagElement(xmlReader.name(), currentTag); if (currentTag == itemElement) { item = RssItem(); } break; case QXmlStreamReader::EndElement: if (xmlReader.name() == QLatin1String("item")) { m_items++; if ((uint)m_items > (uint)m_maxItems) return; emit newsItemReady(item.title, item.description, item.url); emit rssItemReady(item); } break; case QXmlStreamReader::Characters: if (!xmlReader.isWhitespace()) { switch (currentTag) { case titleElement: item.title += xmlReader.text().toString(); break; case descriptionElement: item.description += xmlReader.text().toString(); break; case categoryElement: item.category += xmlReader.text().toString(); break; case linkElement: item.url += xmlReader.text().toString(); break; case imageLinkElement: item.imagePath += xmlReader.text().toString(); break; default: break; } } // !xmlReader.isWhitespace() break; default: break; } } if (xmlReader.error() && xmlReader.error() != QXmlStreamReader::PrematureEndOfDocumentError) { qWarning("Welcome::Internal::RSSFetcher: XML ERROR: %d: %s (%s)", int(xmlReader.lineNumber()), qPrintable(xmlReader.errorString()), qPrintable(item.title)); } }
// TODO: separate tag parsing void buildNodes(xmlNodePtr root_node, MULTIPOINT pts, SHAPE *shape) { int i, k = 0; int l; char val[1024]; xmlNodePtr osmNode; NODE node; KEYVAL tags; initList(&tags); int j = 0 - pts.num_points; // negative ids required for new osm nodes for (i = -1; i > j; i--) { node.id = i; node.x = pts.points[k].x; node.y = pts.points[k].y; osmNode = nodeElement(node); if (shape->num_fields > 0) { // has tags for (l = 0; l < shape->num_fields; l++) { setKey(&tags, getValue(&shape->fields[l])); // set tag value snprintf(val, 1024, "%s", DBFReadStringAttribute(shape->handleDbf, k, l)); setValue(&tags, val); xmlAddChild(osmNode, tagElement(&tags)); } } xmlAddChild(root_node, osmNode); k++; } }
void parseLine(xmlNodePtr root_node, SHAPE *shape) { int i, l, m, v; int k = 0; int n = -1; int o = -1; int start_vertex, end_vertex; char val[1024]; xmlNodePtr osmWay; SHPObject *obj = NULL; NODE node; KEYVAL tags; for (i = 0; i < shape->num_entities; i++) { obj = SHPReadObject(shape->handleShp, k); for (m = 0; m < obj->nParts; m++) { osmWay = wayElement(o); if (m == obj->nParts-1) { // is linestring end_vertex = obj->nVertices; } else { // is multilinestring end_vertex = obj->panPartStart[m+1]; } start_vertex = obj->panPartStart[m]; for (v = start_vertex; v < end_vertex; v++) { node.id = n; node.x = obj->padfX[v]; node.y = obj->padfY[v]; xmlAddChild(root_node, nodeElement(node)); xmlAddChild(osmWay, nodeRef(node)); n--; } if (shape->num_fields > 0) { // has tags for (l = 0; l < shape->num_fields; l++) { setKey(&tags, shape->field_names[l]); // set tag value snprintf(val, 1024, "%s", DBFReadStringAttribute(shape->handleDbf, k, l)); setValue(&tags, val); xmlAddChild(osmWay, tagElement(&tags)); } } xmlAddChild(root_node, osmWay); o--; } k++; } }