X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;ds=inline;f=src%2Fcxml.h;h=110a224f3db1c9d6619552e60a0887ebdac353b9;hb=506fb1b04d4bfa654db64c07fa940462dee90ba6;hp=9a816a2cb113a653fea4f6af588fc092c57ecc8c;hpb=f4d6a45677f279de82301640ed698bc1728c0a8d;p=libcxml.git diff --git a/src/cxml.h b/src/cxml.h index 9a816a2..110a224 100644 --- a/src/cxml.h +++ b/src/cxml.h @@ -1,3 +1,22 @@ +/* + Copyright (C) 2012-2014 Carl Hetherington + + 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. + +*/ + #ifndef LIBCXML_CXML_H #define LIBCXML_CXML_H @@ -6,10 +25,13 @@ #include #include #include -#include #include #include -#include + +/* Hack for OS X compile failure; see https://bugs.launchpad.net/hugin/+bug/910160 */ +#ifdef check +#undef check +#endif namespace xmlpp { class Node; @@ -47,7 +69,7 @@ class Node { public: Node (); - + /** Construct a Node from an xmlpp::Node. This class will * not destroy the xmlpp::Node. * @param node xmlpp::Node. @@ -89,7 +111,12 @@ public: { std::string s = string_child (c); boost::erase_all (s, " "); - return boost::lexical_cast (s); + std::stringstream t; + t.imbue (std::locale::classic ()); + t << s; + T n; + t >> n; + return n; } template @@ -102,9 +129,14 @@ public: std::string t = s.get (); boost::erase_all (t, " "); - return boost::optional (boost::lexical_cast (t)); + std::stringstream u; + u.imbue (std::locale::classic ()); + u << t; + T n; + u >> n; + return n; } - + /** This will mark a child as to be ignored when calling done() */ void ignore_child (std::string) const; @@ -128,7 +160,12 @@ public: { std::string s = string_attribute (c); boost::erase_all (s, " "); - return boost::lexical_cast (s); + std::stringstream t; + t.imbue (std::locale::classic ()); + t << s; + T n; + t >> n; + return n; } template @@ -141,7 +178,12 @@ public: std::string t = s.get (); boost::erase_all (t, " "); - return boost::optional (boost::lexical_cast (t)); + std::stringstream u; + u.imbue (std::locale::classic ()); + u << t; + T n; + u >> n; + return n; } /** @return The content of this node */ @@ -161,29 +203,37 @@ public: xmlpp::Node* node () const { return _node; } - + protected: xmlpp::Node* _node; - + private: - mutable std::list _taken; + mutable std::list _taken; }; typedef boost::shared_ptr NodePtr; +typedef boost::shared_ptr ConstNodePtr; class Document : public Node { public: + Document (); Document (std::string root_name); + Document (std::string root_name, boost::filesystem::path); + + virtual ~Document (); void read_file (boost::filesystem::path); void read_stream (std::istream &); - - virtual ~Document (); + void read_string (std::string); + + std::string root_name () const { + return _root_name; + } private: void take_root_node (); - + xmlpp::DomParser* _parser; std::string _root_name; };