summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-08-29 16:40:35 +0100
committerCarl Hetherington <cth@carlh.net>2013-08-29 16:40:35 +0100
commitcd608545a795e2e939e2c7c485b0aeae9b6576a3 (patch)
tree1e8450d4c9d8713a29c8b2575982c83e32fa4d45
parent5c4e872c3a155c4af75d8ff963c16da28037ffe8 (diff)
File -> Document and allow use of streams.
-rw-r--r--src/cxml.cc36
-rw-r--r--src/cxml.h13
-rw-r--r--test/tests.cc51
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;
-}
diff --git a/src/cxml.h b/src/cxml.h
index 9581adc..7d6e1e0 100644
--- a/src/cxml.h
+++ b/src/cxml.h
@@ -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"));
}