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++;
}
}
}
}