File -> Document and allow use of streams.
authorCarl Hetherington <cth@carlh.net>
Thu, 29 Aug 2013 15:40:35 +0000 (16:40 +0100)
committerCarl Hetherington <cth@carlh.net>
Thu, 29 Aug 2013 15:40:35 +0000 (16:40 +0100)
src/cxml.cc
src/cxml.h
test/tests.cc

index 20d06ee89d0b0bc907b9ddb4bde2b764113a0409..2fa6de39b7749c6545a6701bb840b131455af675 100644 (file)
@@ -196,25 +196,45 @@ cxml::Node::content () const
        return content;
 }
 
-cxml::File::File (string file, string root_name)
+cxml::Document::Document (string root_name)
+       : _root_name (root_name)
+{
+       _parser = new xmlpp::DomParser;
+}
+
+cxml::Document::~Document ()
+{
+       delete _parser;
+}
+
+void
+cxml::Document::read_file (filesystem::path file)
 {
        if (!filesystem::exists (file)) {
                throw cxml::Error ("XML file does not exist");
        }
        
-       _parser = new xmlpp::DomParser;
-       _parser->parse_file (file);
+       _parser->parse_file (file.string ());
+       take_root_node ();
+}
+
+void
+cxml::Document::read_stream (istream& stream)
+{
+       _parser->parse_stream (stream);
+       take_root_node ();
+}
+
+void
+cxml::Document::take_root_node ()
+{
        if (!_parser) {
                throw cxml::Error ("could not parse XML");
        }
 
        _node = _parser->get_document()->get_root_node ();
-       if (_node->get_name() != root_name) {
+       if (_node->get_name() != _root_name) {
                throw cxml::Error ("unrecognised root node");
        }
 }
 
-cxml::File::~File ()
-{
-       delete _parser;
-}
index 9581adce01e8ea6b0f922b4df00d0656217997bc..7d6e1e002d7d361e9bf8c507350ee61fca5c9e4a 100644 (file)
@@ -158,14 +158,21 @@ private:
        mutable std::list<Glib::ustring> _taken;
 };
 
-class File : public Node
+class Document : public Node
 {
 public:
-       File (std::string file, std::string root_name);
-       virtual ~File ();
+       Document (std::string root_name);
+
+       void read_file (boost::filesystem::path);
+       void read_stream (std::istream &);
+       
+       virtual ~Document ();
 
 private:
+       void take_root_node ();
+       
        xmlpp::DomParser* _parser;
+       std::string _root_name;
 };
 
 }
index 326a813216966ad1646db6fb3c05e84a2b74e79d..4bf0ae7ed32a9ce78bbc3b563d2ca8c5b109e6ad 100644 (file)
@@ -34,31 +34,32 @@ using boost::shared_ptr;
 
 BOOST_AUTO_TEST_CASE (test)
 {
-       cxml::File file ("test/ref/a.xml", "A");
+       cxml::Document document ("A");
+       document.read_file ("test/ref/a.xml");
 
-       BOOST_CHECK_EQUAL (file.string_child("B"), "42");
-       BOOST_CHECK_EQUAL (file.number_child<int>("B"), 42);
-       BOOST_CHECK_EQUAL (file.number_child<float>("B"), 42);
-       BOOST_CHECK_EQUAL (file.string_child("C"), "fred");
-       BOOST_CHECK_EQUAL (file.number_child<double>("D"), 42.9);
-       BOOST_CHECK_EQUAL (file.string_child("E"), "yes");
-       BOOST_CHECK_EQUAL (file.bool_child("E"), true);
-       BOOST_CHECK_THROW (file.bool_child("F"), cxml::Error);
+       BOOST_CHECK_EQUAL (document.string_child("B"), "42");
+       BOOST_CHECK_EQUAL (document.number_child<int>("B"), 42);
+       BOOST_CHECK_EQUAL (document.number_child<float>("B"), 42);
+       BOOST_CHECK_EQUAL (document.string_child("C"), "fred");
+       BOOST_CHECK_EQUAL (document.number_child<double>("D"), 42.9);
+       BOOST_CHECK_EQUAL (document.string_child("E"), "yes");
+       BOOST_CHECK_EQUAL (document.bool_child("E"), true);
+       BOOST_CHECK_THROW (document.bool_child("F"), cxml::Error);
 
-       BOOST_CHECK (file.optional_string_child("B"));
-       BOOST_CHECK_EQUAL (file.optional_string_child("B").get(), "42");
-       BOOST_CHECK (file.optional_number_child<int>("B"));
-       BOOST_CHECK_EQUAL (file.optional_number_child<int>("B").get(), 42);
-       BOOST_CHECK (file.optional_number_child<float>("B"));
-       BOOST_CHECK_EQUAL (file.optional_number_child<float>("B").get(), 42);
-       BOOST_CHECK (file.optional_string_child("C"));
-       BOOST_CHECK_EQUAL (file.optional_string_child("C").get(), "fred");
-       BOOST_CHECK (file.optional_number_child<double>("D"));
-       BOOST_CHECK_EQUAL (file.optional_number_child<double>("D").get(), 42.9);
-       BOOST_CHECK (file.optional_string_child("E"));
-       BOOST_CHECK_EQUAL (file.optional_string_child("E").get(), "yes");
-       BOOST_CHECK (file.optional_bool_child("E"));
-       BOOST_CHECK_EQUAL (file.optional_bool_child("E").get(), true);
-       BOOST_CHECK_THROW (file.optional_bool_child("F"), cxml::Error);
-       BOOST_CHECK (!file.optional_bool_child("G"));
+       BOOST_CHECK (document.optional_string_child("B"));
+       BOOST_CHECK_EQUAL (document.optional_string_child("B").get(), "42");
+       BOOST_CHECK (document.optional_number_child<int>("B"));
+       BOOST_CHECK_EQUAL (document.optional_number_child<int>("B").get(), 42);
+       BOOST_CHECK (document.optional_number_child<float>("B"));
+       BOOST_CHECK_EQUAL (document.optional_number_child<float>("B").get(), 42);
+       BOOST_CHECK (document.optional_string_child("C"));
+       BOOST_CHECK_EQUAL (document.optional_string_child("C").get(), "fred");
+       BOOST_CHECK (document.optional_number_child<double>("D"));
+       BOOST_CHECK_EQUAL (document.optional_number_child<double>("D").get(), 42.9);
+       BOOST_CHECK (document.optional_string_child("E"));
+       BOOST_CHECK_EQUAL (document.optional_string_child("E").get(), "yes");
+       BOOST_CHECK (document.optional_bool_child("E"));
+       BOOST_CHECK_EQUAL (document.optional_bool_child("E").get(), true);
+       BOOST_CHECK_THROW (document.optional_bool_child("F"), cxml::Error);
+       BOOST_CHECK (!document.optional_bool_child("G"));
 }