summaryrefslogtreecommitdiff
path: root/libxsd/xsd/cxx/parser/document.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2009-09-17 07:15:29 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2009-09-17 07:15:29 +0200
commitf0510d2f90467de8e8f260b47d79a9baaf9bef17 (patch)
tree0b9929946f06a9cbe9b9e8f2a7600dae4e048f79 /libxsd/xsd/cxx/parser/document.hxx
Start tracking XSD with git
Diffstat (limited to 'libxsd/xsd/cxx/parser/document.hxx')
-rw-r--r--libxsd/xsd/cxx/parser/document.hxx90
1 files changed, 90 insertions, 0 deletions
diff --git a/libxsd/xsd/cxx/parser/document.hxx b/libxsd/xsd/cxx/parser/document.hxx
new file mode 100644
index 0000000..dd8be4a
--- /dev/null
+++ b/libxsd/xsd/cxx/parser/document.hxx
@@ -0,0 +1,90 @@
+// file : xsd/cxx/parser/document.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2005-2009 Code Synthesis Tools CC
+// license : GNU GPL v2 + exceptions; see accompanying LICENSE file
+
+#ifndef XSD_CXX_PARSER_DOCUMENT_HXX
+#define XSD_CXX_PARSER_DOCUMENT_HXX
+
+#include <string>
+#include <cstddef> // std::size_t
+
+#include <xsd/cxx/ro-string.hxx>
+#include <xsd/cxx/parser/elements.hxx>
+
+namespace xsd
+{
+ namespace cxx
+ {
+ namespace parser
+ {
+ // If you want to use a different underlying XML parser, all you
+ // need to do is to route events to this interface.
+ //
+ template <typename C>
+ class document
+ {
+ public:
+ virtual
+ ~document ();
+
+ document (parser_base<C>& root,
+ const std::basic_string<C>& ns,
+ const std::basic_string<C>& name);
+
+ public:
+ // The type argument is a type name and namespace from the
+ // xsi:type attribute in the form "<name> <namespace>" with
+ // the space and namespace part absent if the type does not
+ // have a namespace or 0 if xsi:type is not present.
+ //
+ void
+ start_element (const ro_string<C>& ns,
+ const ro_string<C>& name,
+ const ro_string<C>* type);
+
+ void
+ end_element (const ro_string<C>& ns, const ro_string<C>& name);
+
+ void
+ attribute (const ro_string<C>& ns,
+ const ro_string<C>& name,
+ const ro_string<C>& value);
+
+ void
+ characters (const ro_string<C>&);
+
+ protected:
+ document ();
+
+ // This function is called to obtain the root element type parser.
+ // If the returned pointed is 0 then the whole document content
+ // is ignored.
+ //
+ virtual parser_base<C>*
+ start_root_element (const ro_string<C>& ns,
+ const ro_string<C>& name,
+ const ro_string<C>* type);
+
+ // This function is called to indicate the completion of document
+ // parsing. The parser argument contains the pointer returned by
+ // start_root_element.
+ //
+ virtual void
+ end_root_element (const ro_string<C>& ns,
+ const ro_string<C>& name,
+ parser_base<C>* parser);
+
+ private:
+ parser_base<C>* root_;
+ std::basic_string<C> ns_;
+ std::basic_string<C> name_;
+ std::size_t depth_;
+ };
+ }
+ }
+}
+
+#include <xsd/cxx/parser/document.txx>
+
+#endif // XSD_CXX_PARSER_DOCUMENT_HXX