/*
- Copyright (C) 2012-2016 Carl Hetherington <cth@carlh.net>
+ Copyright (C) 2012-2019 Carl Hetherington <cth@carlh.net>
This file is part of libcxml.
#ifndef LIBCXML_CXML_H
#define LIBCXML_CXML_H
-#include <locked_sstream.h>
#include <boost/shared_ptr.hpp>
#include <boost/optional.hpp>
#include <boost/filesystem.hpp>
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 <typename P, typename Q>
+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
{
{
std::string s = string_child (c);
boost::erase_all (s, " ");
- locked_stringstream t;
- t.imbue (std::locale::classic ());
- t << s;
- T n;
- t >> n;
- return n;
+ return raw_convert<T> (s);
}
template <class T>
std::string t = s.get ();
boost::erase_all (t, " ");
- locked_stringstream u;
- u.imbue (std::locale::classic ());
- u << t;
- T n;
- u >> n;
- return n;
+ return raw_convert<T> (t);
}
/** This will mark a child as to be ignored when calling done() */
{
std::string s = string_attribute (c);
boost::erase_all (s, " ");
- locked_stringstream t;
- t.imbue (std::locale::classic ());
- t << s;
- T n;
- t >> n;
- return n;
+ return raw_convert<T> (s);
}
template <class T>
std::string t = s.get ();
boost::erase_all (t, " ");
- locked_stringstream u;
- u.imbue (std::locale::classic ());
- u << t;
- T n;
- u >> n;
- return n;
+ return raw_convert<T> (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 */
boost::shared_ptr<Node> node_child (std::string) const;
boost::shared_ptr<Node> optional_node_child (std::string) const;
+ std::list<boost::shared_ptr<Node> > node_children () const;
std::list<boost::shared_ptr<Node> > node_children (std::string) const;
xmlpp::Node* node () const {