diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-08-29 16:40:35 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-08-29 16:40:35 +0100 |
| commit | cd608545a795e2e939e2c7c485b0aeae9b6576a3 (patch) | |
| tree | 1e8450d4c9d8713a29c8b2575982c83e32fa4d45 | |
| parent | 5c4e872c3a155c4af75d8ff963c16da28037ffe8 (diff) | |
File -> Document and allow use of streams.
| -rw-r--r-- | src/cxml.cc | 36 | ||||
| -rw-r--r-- | src/cxml.h | 13 | ||||
| -rw-r--r-- | test/tests.cc | 51 |
3 files changed, 64 insertions, 36 deletions
diff --git a/src/cxml.cc b/src/cxml.cc index 20d06ee..2fa6de3 100644 --- a/src/cxml.cc +++ b/src/cxml.cc @@ -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; -} @@ -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; }; } diff --git a/test/tests.cc b/test/tests.cc index 326a813..4bf0ae7 100644 --- a/test/tests.cc +++ b/test/tests.cc @@ -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")); } |
