X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fcxml.cc;h=d3ec9e7fd95f6a27efa9a6eeae6543345cc57da9;hb=5532b044b33f40205c3fed2cd3d1c21dd718507b;hp=b251ae79610a45e4b27f3d31d19c8c0a566a210c;hpb=df3b86a07de00a1a48845bc82e2d96aa0fc531dc;p=libcxml.git diff --git a/src/cxml.cc b/src/cxml.cc index b251ae7..d3ec9e7 100644 --- a/src/cxml.cc +++ b/src/cxml.cc @@ -1,31 +1,32 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2016 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of libcxml. + + libcxml 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, + libcxml 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. + along with libcxml. If not, see . */ -#include -#include #include #include #include #include "cxml.h" -using namespace std; -using namespace boost; +using std::string; +using std::list; +using boost::shared_ptr; +using boost::optional; cxml::Node::Node () : _node (0) @@ -42,7 +43,9 @@ cxml::Node::Node (xmlpp::Node* node) string cxml::Node::name () const { - assert (_node); + if (!_node) { + throw Error ("No node to read name from"); + } return _node->get_name (); } @@ -55,7 +58,7 @@ cxml::Node::node_child (string name) const } else if (n.empty ()) { throw cxml::Error ("missing XML tag " + name + " in " + _node->get_name()); } - + return n.front (); } @@ -68,10 +71,26 @@ cxml::Node::optional_node_child (string name) const } else if (n.empty ()) { return shared_ptr (); } - + return n.front (); } +list > +cxml::Node::node_children () const +{ + if (!_node) { + throw Error ("No node to read children from"); + } + xmlpp::Node::NodeList c = _node->get_children (); + + list > n; + for (xmlpp::Node::NodeList::iterator i = c.begin (); i != c.end(); ++i) { + n.push_back (shared_ptr (new Node (*i))); + } + + return n; +} + list > cxml::Node::node_children (string name) const { @@ -80,14 +99,14 @@ cxml::Node::node_children (string name) const */ xmlpp::Node::NodeList c = _node->get_children (); - + list > n; for (xmlpp::Node::NodeList::iterator i = c.begin (); i != c.end(); ++i) { if ((*i)->get_name() == name) { n.push_back (shared_ptr (new Node (*i))); } } - + _taken.push_back (name); return n; } @@ -117,7 +136,7 @@ bool cxml::Node::bool_child (string c) const { string const s = string_child (c); - return (s == "1" || s == "yes"); + return (s == "1" || s == "yes" || s == "True"); } optional @@ -127,8 +146,8 @@ cxml::Node::optional_bool_child (string c) const if (!s) { return optional (); } - - return (s.get() == "1" || s.get() == "yes"); + + return (s.get() == "1" || s.get() == "yes" || s.get() == "True"); } void @@ -142,12 +161,12 @@ cxml::Node::string_attribute (string name) const { xmlpp::Element const * e = dynamic_cast (_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 (); @@ -160,7 +179,7 @@ cxml::Node::optional_string_attribute (string name) const if (!e) { return optional (); } - + xmlpp::Attribute* a = e->get_attribute (name); if (!a) { return optional (); @@ -202,11 +221,11 @@ string cxml::Node::content () const { string content; - + xmlpp::Node::NodeList c = _node->get_children (); for (xmlpp::Node::NodeList::const_iterator i = c.begin(); i != c.end(); ++i) { xmlpp::ContentNode const * v = dynamic_cast (*i); - if (v) { + if (v && dynamic_cast(v)) { content += v->get_content (); } } @@ -239,26 +258,31 @@ cxml::Document::Document (string root_name, boost::filesystem::path file) read_file (file); } +cxml::Document::Document () +{ + _parser = new xmlpp::DomParser (); +} + cxml::Document::~Document () { delete _parser; } void -cxml::Document::read_file (filesystem::path file) +cxml::Document::read_file (boost::filesystem::path file) { - if (!filesystem::exists (file)) { - throw cxml::Error ("XML file does not exist"); + if (!boost::filesystem::exists (file)) { + throw cxml::Error ("XML file " + file.string() + " does not exist"); } - + _parser->parse_file (file.string ()); take_root_node (); } void -cxml::Document::read_stream (istream& stream) +cxml::Document::read_string (string s) { - _parser->parse_stream (stream); + _parser->parse_memory (s); take_root_node (); } @@ -270,8 +294,9 @@ 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 (); } } -