9 #include <QXmlStreamReader>
12 XmlParser::XmlParser()
16 QList<XmlParser::LocsData> XmlParser::parseLocs(QXmlStreamReader &xml)
18 QList<XmlParser::LocsData> retVal;
21 QSet<QString> elements;
32 while (xml.readNextStartElement()) {
33 QHash<QString,QString> text;
35 while (xml.readNextStartElement()) {
36 if (xml.name() == "coord") {
37 xml.readNextStartElement();
39 text.insert(xml.name().toString(),xml.readElementText());
41 xml.readNextStartElement();
43 text.insert(xml.name().toString(),xml.readElementText());
45 xml.readNextStartElement(); // up a level
47 text.insert(xml.name().toString(),xml.readElementText());
52 data.m_x = text.value("x");
53 data.m_y = text.value("y");
54 data.m_arrTime = text.value("arrTime");
55 data.m_depTime = text.value("depTime");
56 data.m_name = text.value("name");
64 QList<LegData> XmlParser::parseLegs(QXmlStreamReader &xml)
66 QList<LegData> retVal;
68 while (xml.readNextStartElement()) { // loop over leg <node>s
72 QString departureTime;
76 if (xml.name() == "node") { // new leg
77 xml.readNextStartElement();
79 if (xml.name() == "length") {
80 tripDistance = xml.readElementText();
83 xml.readNextStartElement();
85 if (xml.name() == "duration") {
86 tripTime = xml.readElementText();
89 xml.readNextStartElement();
91 if (xml.name() == "type") {
92 how = parseType(xml.readElementText());
95 xml.readNextStartElement();
97 if (xml.name() == "code") { // only if type != walk
98 lineCode = xml.readElementText();
100 xml.readNextStartElement();
103 if (xml.name() == "locs") {
104 QList<LocsData> locs = parseLocs(xml);
105 arrivalTime = parseTime(locs[0].m_arrTime);
106 departureTime = parseTime(locs[0].m_depTime);
110 legData.m_arrivalTime = arrivalTime;
111 legData.m_departureTime = departureTime;
113 legData.m_lineCode = parseJORECode(lineCode);
114 legData.m_tripDistance = tripDistance;
115 legData.m_tripTime = tripTime;
119 xml.skipCurrentElement();
127 QList<RouteData> XmlParser::parseRouteData(const QByteArray &reply)
129 QList<RouteData> retVal;
131 QXmlStreamReader xml(reply);
134 while (!xml.atEnd()) {
137 if (xml.name() == "response") {
139 while (xml.readNextStartElement()) { // loop over route <node>
142 if (xml.name() == "node") { // ROUTE node
144 xml.readNextStartElement(); // redundant single <node>
146 xml.readNextStartElement();
148 if (xml.name() == "length") {
149 routeData.m_tripDistance = xml.readElementText();
152 xml.readNextStartElement();
154 if (xml.name() == "duration") {
155 routeData.m_tripTime = xml.readElementText();
158 xml.readNextStartElement();
160 if (xml.name() == "legs") {
161 QList<LegData> legData = parseLegs(xml);
163 foreach (LegData thisLeg, legData) {
164 // set the departure time of the Route to the departure time of the
165 // first non-walk (usually the bus)
166 if (thisLeg.m_how != "walk" && routeData.m_departureTime.isEmpty()) {
167 routeData.m_departureTime = thisLeg.m_departureTime;
168 routeData.m_lineCode = thisLeg.m_lineCode;
171 routeData << thisLeg;
174 xml.skipCurrentElement();
186 if (xml.hasError()) {
187 qDebug() << "xml error:" << xml.errorString();
193 QPair<QString,QString> XmlParser::parseGeocode(const QByteArray &reply)
195 QPair<QString,QString> retVal;
199 QXmlStreamReader xml(reply);
201 while (!xml.atEnd()) {
204 if (xml.name() == "coords") {
205 QString text(xml.readElementText());
207 QStringList coords(text.split(","));
209 QString newLongitude(coords.at(0));
210 QString newLatitude(coords.at(1));
212 retVal.first = newLongitude;
213 retVal.second = newLatitude;
218 if (xml.name() == "ERROR") {
225 qDebug() << "xml error";
231 QString XmlParser::parseJORECode(const QString &joreCode) const
235 QString areaTransportTypeCode(joreCode.mid(0,1));
236 QString lineCode(joreCode.mid(1,3));
237 QString letterVariant(joreCode.mid(4,1));
238 QString letterNumberVariant(joreCode.mid(5,1));
239 QString direction(joreCode.mid(6,1));
241 Q_UNUSED(areaTransportTypeCode);
242 Q_UNUSED(letterNumberVariant);
245 lineCode.setNum(lineCode.toInt());
249 if (letterVariant != " ") {
250 retVal += letterVariant;
256 QString XmlParser::parseTime(const QString &time) const
258 QString retVal = time.right(4).insert(2,":");
263 QString XmlParser::parseType(const QString &type) const
266 QStringList transportType;
289 retVal = transportType.at(type.toInt()-1);