multiparserOO.cpp added by _1126 on Mon Dec 10 14:24:55 2012
#include <iostream> #include <fstream> class Multiparser { private: void parseXML(std::ifstream *input); void parsePeople(std::ifstream *input); public: void startPeopleParsing(); void startXMLParsing(); std::ifstream input; char character; }; int main(int argc, char ** argv) { Multiparser multiparser; if (argc != 2) std::cout << "usage: " << argv[0] << " <file-to-parse>." << std::endl; else { multiparser.input.open(argv[1]); if (!multiparser.input.is_open()) std::cout << "Error: could not open the file " << argv[1] << std::endl; else { multiparser.input.get(multiparser.character); if (multiparser.character == '<') { multiparser.input.putback(multiparser.character); multiparser.startXMLParsing(); } else if (multiparser.character == 'N') { multiparser.input.putback(multiparser.character); multiparser.startPeopleParsing(); } else std::cout << "Wrong input." << std::endl; } multiparser.input.close(); } return 0; } void Multiparser::startXMLParsing() { parseXML(&input); } void Multiparser::startPeopleParsing() { parsePeople(&input); } void Multiparser::parseXML(std::ifstream *input) { char character; char buffer[100]; int i; enum position { inbetween, inName, expAttName, expAttValue, inAttValue }; enum position position; while (!input->eof()) { input->get(character); switch(character) { case '<': position = inName; i = 0; break; case ' ': if (position == inName) { buffer[i] = '\0'; std::cout << "Name of Tag: \t\t" << buffer << std::endl; i = 0; position = expAttName; } break; case '=': if (position == expAttName) { buffer[i] = '\0'; std::cout << "Name of Attribute: \t" << buffer << std::endl; i = 0; position = expAttValue; } break; case '"': if (position == expAttValue) { position = inAttValue; i = 0; } else if (position == inAttValue) { buffer[i] = '\0'; std::cout << "Value of Attribute: \t" << buffer << std::endl; i = 0; position = expAttName; } break; default: if (position != inbetween) { buffer[i] = character; i++; } } } } void Multiparser::parsePeople(std::ifstream *input) { char character; char buffer[100]; int i; enum position { inbetween, inLastName, expFirstName, inFirstName, expBirthdate, inBirthdate }; enum position position; while (!input->eof()) { input->get(character); switch (character) { case ':': if (position == inbetween) position = inLastName; else if (position == expBirthdate) position = inBirthdate; i = 0; break; case ',': if (position == inLastName) { buffer[i] = '\0'; std::cout << "Last Name: " << buffer << std::endl; i = 0; position = expFirstName; } if (position == expFirstName) position = inFirstName; break; case ' ': if (position == inbetween) i = 0; else if (position == expFirstName) i = 0; break; case '.': if (position == inFirstName) { buffer[i] = '\0'; std::cout << "First Name: " << buffer << std::endl; i = 0; position = expBirthdate; } else if (position == inBirthdate) { buffer[i] = character; i++; } break; case '\n': if (position == inBirthdate) { buffer[i] = '\0'; std::cout << "Birthdate: " << buffer << std::endl; i = 0; position = inbetween; } break; default: if (position != inbetween) { buffer[i] = character; i++; } } } }