X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Fcxml.h;h=20a948ae29e920a5204e37cb2b91b53b0fb9a1d8;hb=3c371e9aead80bfed91ae208e2ce782c7bf4901b;hp=ce62ca9664211d36129dc41fb02f0246217bb2ad;hpb=a7b6fa909acdc58b9eac6b563fab8f4d9999b898;p=libcxml.git diff --git a/src/cxml.h b/src/cxml.h index ce62ca9..20a948a 100644 --- a/src/cxml.h +++ b/src/cxml.h @@ -1,33 +1,38 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2019 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 . */ #ifndef LIBCXML_CXML_H #define LIBCXML_CXML_H -#include -#include -#include #include #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; @@ -60,12 +65,45 @@ private: std::string _message; }; +/** A sort-of version of boost::lexical_cast that does uses the "C" + * locale (i.e. no thousands separators and a . for the decimal separator). + */ +template +P +raw_convert (Q v) +{ + /* We can't write a generic version of raw_convert; all required + versions must be specialised. + */ + BOOST_STATIC_ASSERT (sizeof(Q) == 0); +} + +template <> +int +raw_convert (std::string v); + +template <> +unsigned int +raw_convert (std::string v); + +template <> +long int +raw_convert (std::string v); + +template <> +float +raw_convert (std::string v); + +template <> +double +raw_convert (std::string v); + /** @brief A wrapper for a xmlpp::Node which simplifies parsing */ class Node { public: Node (); - + /** Construct a Node from an xmlpp::Node. This class will * not destroy the xmlpp::Node. * @param node xmlpp::Node. @@ -107,12 +145,7 @@ public: { std::string s = string_child (c); boost::erase_all (s, " "); - std::stringstream t; - t.imbue (std::locale::classic ()); - t << s; - T n; - t >> n; - return n; + return raw_convert (s); } template @@ -125,14 +158,9 @@ public: std::string t = s.get (); boost::erase_all (t, " "); - std::stringstream u; - u.imbue (std::locale::classic ()); - u << t; - T n; - u >> n; - return n; + return raw_convert (t); } - + /** This will mark a child as to be ignored when calling done() */ void ignore_child (std::string) const; @@ -156,12 +184,7 @@ public: { std::string s = string_attribute (c); boost::erase_all (s, " "); - std::stringstream t; - t.imbue (std::locale::classic ()); - t << s; - T n; - t >> n; - return n; + return raw_convert (s); } template @@ -174,15 +197,10 @@ public: std::string t = s.get (); boost::erase_all (t, " "); - std::stringstream u; - u.imbue (std::locale::classic ()); - u << t; - T n; - u >> n; - return n; + return raw_convert (t); } - /** @return The content of this node */ + /** @return The text content of this node (excluding comments or CDATA) */ std::string content () const; /** @return namespace URI of this node */ @@ -194,17 +212,18 @@ public: boost::shared_ptr node_child (std::string) const; boost::shared_ptr optional_node_child (std::string) const; + std::list > node_children () const; std::list > node_children (std::string) const; xmlpp::Node* node () const { return _node; } - + protected: xmlpp::Node* _node; - + private: - mutable std::list _taken; + mutable std::list _taken; }; typedef boost::shared_ptr NodePtr; @@ -220,16 +239,15 @@ public: virtual ~Document (); void read_file (boost::filesystem::path); - void read_stream (std::istream &); 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; };