Changeset - 593cb59ea6ee
[Not reviewed]
0 0 2
HanzZ - 13 years ago 2012-05-23 22:25:40
hanzz.k@gmail.com
StringTreeParser
2 files changed with 95 insertions and 0 deletions:
0 comments (0 inline, 0 general)
include/Swiften/Parser/StringTreeParser.cpp
Show inline comments
 
new file 100644
 
/*
 
 * Copyright (c) 2011 Jan Kaluza
 
 * Licensed under the Simplified BSD license.
 
 * See Documentation/Licenses/BSD-simplified.txt for more information.
 
 */
 

	
 
#include <Swiften/Parser/StringTreeParser.h>
 
#include <Swiften/Parser/PlatformXMLParserFactory.h>
 
#include <Swiften/Parser/Tree/ParserElement.h>
 
#include <Swiften/Parser/XMLParser.h>
 

	
 
namespace Swift {
 

	
 
class DefaultStringTreeParser : public StringTreeParser {
 
	public:
 
		void handleTree(ParserElement::ref root) {
 
			root_ = root;
 
		}
 

	
 
		ParserElement::ref getRoot() {
 
			return root_;
 
		}
 

	
 
	private:
 
		ParserElement::ref root_;
 
};
 
	
 
ParserElement::ref StringTreeParser::parse(const std::string &xml) {
 
	PlatformXMLParserFactory factory;
 
	DefaultStringTreeParser client;
 
	XMLParser *parser = factory.createXMLParser(&client);
 
	
 
	parser->parse(xml);
 
	ParserElement::ref root = client.getRoot();
 
	delete parser;
 
	return root;
 
}
 

	
 
}
include/Swiften/Parser/StringTreeParser.h
Show inline comments
 
new file 100644
 
/*
 
 * Copyright (c) 2011 Jan Kaluza
 
 * Licensed under the Simplified BSD license.
 
 * See Documentation/Licenses/BSD-simplified.txt for more information.
 
 */
 

	
 
#pragma once
 

	
 
#include <deque>
 

	
 
#include <boost/shared_ptr.hpp>
 
#include <boost/smart_ptr/make_shared.hpp>
 

	
 
#include <Swiften/Parser/Tree/ParserElement.h>
 
#include <Swiften/Parser/XMLParserClient.h>
 

	
 
namespace Swift {
 
	/**
 
	 * Generics parser offering something a bit like a DOM to work with.
 
	 */
 
	class StringTreeParser : public XMLParserClient {
 
		public:
 
			StringTreeParser() : XMLParserClient() {}
 
			
 
			virtual void handleStartElement(const std::string& element, const std::string& xmlns, const AttributeMap& attributes) {
 
				if (!root_) {
 
					root_ = boost::make_shared<ParserElement>(element, xmlns, attributes);
 
					elementStack_.push_back(root_);
 
				}
 
				else {
 
					ParserElement::ref current = *elementStack_.rbegin();
 
					elementStack_.push_back(current->addChild(element, xmlns, attributes));
 
				}
 
			}
 

	
 
			virtual void handleEndElement(const std::string& /*element*/, const std::string&) {
 
				elementStack_.pop_back();
 
				if (elementStack_.empty()) {
 
					handleTree(root_);
 
				}
 
			}
 

	
 
			virtual void handleCharacterData(const std::string& data) {
 
				ParserElement::ref current = *elementStack_.rbegin();
 
				current->appendCharacterData(data);
 
			}
 

	
 
			virtual void handleTree(ParserElement::ref root) = 0;
 

	
 
			static ParserElement::ref parse(const std::string &xml);
 

	
 
		private:
 
			std::deque<ParserElement::ref> elementStack_;
 
			ParserElement::ref root_;
 
	};
 
}
0 comments (0 inline, 0 general)