+/*
+ Copyright (C) 2012-2014 Carl Hetherington <cth@carlh.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
#include <sstream>
#include <iostream>
-#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
#include <boost/algorithm/string.hpp>
#include <libxml++/libxml++.h>
}
-cxml::Node::Node (xmlpp::Node const * node)
+cxml::Node::Node (xmlpp::Node* node)
: _node (node)
{
{
xmlpp::Element const * e = dynamic_cast<const xmlpp::Element *> (_node);
if (!e) {
- throw cxml::Error ("missing attribute");
+ throw cxml::Error ("missing attribute " + name);
}
xmlpp::Attribute* a = e->get_attribute (name);
if (!a) {
- throw cxml::Error ("missing attribute");
+ throw cxml::Error ("missing attribute " + name);
}
return a->get_value ();
return content;
}
+string
+cxml::Node::namespace_uri () const
+{
+ return _node->get_namespace_uri ();
+}
+
string
cxml::Node::namespace_prefix () const
{
_parser = new xmlpp::DomParser;
}
+cxml::Document::Document (string root_name, boost::filesystem::path file)
+ : _root_name (root_name)
+{
+ _parser = new xmlpp::DomParser ();
+ read_file (file);
+}
+
+cxml::Document::Document ()
+{
+ _parser = new xmlpp::DomParser ();
+}
+
cxml::Document::~Document ()
{
delete _parser;
cxml::Document::read_file (filesystem::path file)
{
if (!filesystem::exists (file)) {
- throw cxml::Error ("XML file does not exist");
+ throw cxml::Error ("XML file " + file.string() + " does not exist");
}
_parser->parse_file (file.string ());
take_root_node ();
}
+void
+cxml::Document::read_string (string s)
+{
+ stringstream t (s);
+ _parser->parse_stream (t);
+ take_root_node ();
+}
+
void
cxml::Document::take_root_node ()
{
}
_node = _parser->get_document()->get_root_node ();
- if (_node->get_name() != _root_name) {
- throw cxml::Error ("unrecognised root node");
+ if (!_root_name.empty() && _node->get_name() != _root_name) {
+ throw cxml::Error ("unrecognised root node " + _node->get_name() + "(expecting " + _root_name + ")");
+ } else if (_root_name.empty ()) {
+ _root_name = _node->get_name ();
}
}