void ForecastSensor::parse() { r.clear(); try { std::cout << "get url: " << url << std::endl; //http://www.yr.no/place/Czech_Republic/Central_Bohemia/%C4%8Cerven%C3%A9_Pe%C4%8Dky/forecast_hour_by_hour.xml Poco::URI uri(url); std::string path(uri.getPathAndQuery()); Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort()); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, path, Poco::Net::HTTPMessage::HTTP_1_0); Poco::Net::HTTPResponse response; session.sendRequest(request); std::istream& rs = session.receiveResponse(response); std::cout << response.getStatus() << " " << response.getReason() << std::endl; if (response.getStatus() != Poco::Net::HTTPResponse::HTTP_OK) { throw Poco::Exception("Cannot get remote data"); } //Poco::StreamCopier::copyStream(rs, std::cout); Poco::XML::InputSource src(rs); ForecastParser handler; handler.Forecast += Poco::delegate(this, &ForecastSensor::onData); Poco::XML::SAXParser parser; parser.setContentHandler(&handler); try { std::cout << "parse" << std::endl; parser.parse(&src); } catch (Poco::Exception& e) { std::cerr << e.displayText() << std::endl; } handler.Forecast -= Poco::delegate(this, &ForecastSensor::onData); } catch (Poco::Exception& exc) { std::cerr << exc.displayText() << std::endl; } }
//---------------------------------------- // TestSAXParser //---------------------------------------- void TestSAXParser(ScopedLogMessage& msg, const std::string& xml) { msg.Message("--- original xml ---\n" + xml); MyHandler handler(msg); Poco::XML::SAXParser parser; parser.setFeature(Poco::XML::XMLReader::FEATURE_NAMESPACES, true); parser.setFeature(Poco::XML::XMLReader::FEATURE_NAMESPACE_PREFIXES, true); parser.setContentHandler(&handler); parser.setProperty(Poco::XML::XMLReader::PROPERTY_LEXICAL_HANDLER, static_cast<Poco::XML::LexicalHandler*>(&handler)); try { msg.Message("--- parsed ---"); parser.parseString(kXMLString); } catch(Poco::Exception& exc) { msg.Message(exc.displayText()); } }