diff options
Diffstat (limited to 'libxsd/libxsd/cxx/xml/dom/parsing-source.hxx')
-rw-r--r-- | libxsd/libxsd/cxx/xml/dom/parsing-source.hxx | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/libxsd/libxsd/cxx/xml/dom/parsing-source.hxx b/libxsd/libxsd/cxx/xml/dom/parsing-source.hxx new file mode 100644 index 0000000..9016014 --- /dev/null +++ b/libxsd/libxsd/cxx/xml/dom/parsing-source.hxx @@ -0,0 +1,152 @@ +// file : libxsd/cxx/xml/dom/parsing-source.hxx +// license : GNU GPL v2 + exceptions; see accompanying LICENSE file + +#ifndef LIBXSD_CXX_XML_DOM_PARSING_SOURCE_HXX +#define LIBXSD_CXX_XML_DOM_PARSING_SOURCE_HXX + +#include <string> + +#include <xercesc/dom/DOMNode.hpp> +#include <xercesc/dom/DOMAttr.hpp> +#include <xercesc/dom/DOMElement.hpp> +#include <xercesc/dom/DOMDocument.hpp> +#include <xercesc/dom/DOMNamedNodeMap.hpp> +#include <xercesc/dom/DOMErrorHandler.hpp> + +#include <xercesc/sax/InputSource.hpp> + +#include <libxsd/cxx/xml/elements.hxx> // properies +#include <libxsd/cxx/xml/error-handler.hxx> +#include <libxsd/cxx/xml/dom/auto-ptr.hxx> +#include <libxsd/cxx/xml/dom/elements.hxx> // name +#include <libxsd/cxx/xml/dom/parsing-header.hxx> + +namespace xsd +{ + namespace cxx + { + namespace xml + { + namespace dom + { + // Parser state object. Can be used for parsing elements (and + // optionally text), attributes, or both. + // + template <typename C> + class parser + { + public: + parser (const xercesc::DOMElement& e, bool ep, bool tp, bool ap); + + // Content parsing. + // + bool + more_content () + { + return next_content_ != 0; + } + + const xercesc::DOMElement& + cur_element () + { + return *static_cast<const xercesc::DOMElement*> (next_content_); + } + + const xercesc::DOMText& + cur_text () + { + return *static_cast<const xercesc::DOMText*> (next_content_); + } + + bool + cur_is_text () + { + return next_content_->getNodeType () != + xercesc::DOMNode::ELEMENT_NODE; + } + + void + next_content (bool text); + + // Attribute parsing. + // + bool + more_attributes () + { + return as_ > ai_; + } + + const xercesc::DOMAttr& + next_attribute () + { + return *static_cast<const xercesc::DOMAttr*> (a_->item (ai_++)); + } + + void + reset_attributes () + { + ai_ = 0; + } + + const xercesc::DOMElement& + element () const + { + return element_; + } + + private: + parser (const parser&); + + parser& + operator= (const parser&); + + private: + const xercesc::DOMElement& element_; + const xercesc::DOMNode* next_content_; + + const xercesc::DOMNamedNodeMap* a_; + XMLSize_t ai_; // Index of the next DOMAttr. + XMLSize_t as_; // Cached size of a_. + }; + + + // Parsing flags. + // + const unsigned long dont_validate = 0x00000400UL; + const unsigned long no_muliple_imports = 0x00000800UL; + + template <typename C> + XSD_DOM_AUTO_PTR<xercesc::DOMDocument> + parse (xercesc::InputSource&, + error_handler<C>&, + const properties<C>&, + unsigned long flags); + + template <typename C> + XSD_DOM_AUTO_PTR<xercesc::DOMDocument> + parse (xercesc::InputSource&, + xercesc::DOMErrorHandler&, + const properties<C>&, + unsigned long flags); + + template <typename C> + XSD_DOM_AUTO_PTR<xercesc::DOMDocument> + parse (const std::basic_string<C>& uri, + error_handler<C>&, + const properties<C>&, + unsigned long flags); + + template <typename C> + XSD_DOM_AUTO_PTR<xercesc::DOMDocument> + parse (const std::basic_string<C>& uri, + xercesc::DOMErrorHandler&, + const properties<C>&, + unsigned long flags); + } + } + } +} + +#include <libxsd/cxx/xml/dom/parsing-source.txx> + +#endif // LIBXSD_CXX_XML_DOM_PARSING_SOURCE_HXX |