26#ifndef d4_parser_sax2_h
27#define d4_parser_sax2_h
38#include <libxml/parserInternals.h>
41#define D4_PARSE_BUFF_SIZE 1048576
47class D4BaseTypeFactory;
89 inside_attribute_container,
91 inside_attribute_value,
92 inside_other_xml_attribute,
120 xmlSAXHandler d_dmr_sax_parser;
125 DMR *dmr()
const {
return d_dmr; }
129 void push_state(D4ParserSax2::ParseState state) { s.push(state); }
130 D4ParserSax2::ParseState get_state()
const {
return s.top(); }
131 void pop_state() { s.pop(); }
132 bool empty_state()
const {
return s.empty(); }
134 stack<BaseType *> btp_stack;
135 void push_basetype(
BaseType *btp) { btp_stack.push(btp); }
136 BaseType *top_basetype()
const {
return btp_stack.top(); }
137 void pop_basetype() { btp_stack.pop(); }
138 bool empty_basetype()
const {
return btp_stack.empty(); }
140 stack<D4Group *> grp_stack;
141 void push_group(
D4Group *grp) { grp_stack.push(grp); }
142 D4Group *top_group()
const {
return grp_stack.top(); }
143 void pop_group() { grp_stack.pop(); }
144 bool empty_group()
const {
return grp_stack.empty(); }
146 stack<D4Attributes *> d_attrs_stack;
147 void push_attributes(
D4Attributes *attr) { d_attrs_stack.push(attr); }
148 D4Attributes *top_attributes()
const {
return d_attrs_stack.top(); }
149 void pop_attributes() { d_attrs_stack.pop(); }
150 bool empty_attributes()
const {
return d_attrs_stack.
empty(); }
154 void clear_enum_def() { d_enum_def = 0; }
158 void clear_dim_def() { d_dim_def = 0; }
165 unsigned int other_xml_depth;
166 unsigned int unknown_depth;
170 xmlParserCtxtPtr d_context;
173 string dods_attr_name;
174 string dods_attr_type;
179 bool debug()
const {
return d_debug; }
200 prefix = attributes[0] != 0 ? (
const char *)attributes[0] :
"";
201 nsURI = attributes[1] != 0 ? (
const char *)attributes[1] :
"";
202 value = string((
const char *)attributes[2], (
const char *)attributes[3]);
214 typedef map<string, XMLAttribute> XMLAttrMap;
215 XMLAttrMap xml_attrs;
217 XMLAttrMap::iterator xml_attr_begin() {
return xml_attrs.begin(); }
219 XMLAttrMap::iterator xml_attr_end() {
return xml_attrs.end(); }
221 map<string, string> namespace_table;
223 void cleanup_parse();
231 void transfer_xml_attrs(
const xmlChar **attrs,
int nb_attributes);
232 void transfer_xml_ns(
const xmlChar **namespaces,
int nb_namespaces);
233 bool check_required_attribute(
const string &attr);
234 bool check_attribute(
const string &attr);
235 void process_variable_helper(
Type t, ParseState s,
const xmlChar **attrs,
int nb_attributes);
237 void process_enum_const_helper(
const xmlChar **attrs,
int nb_attributes);
238 void process_enum_def_helper(
const xmlChar **attrs,
int nb_attributes);
240 bool process_dimension(
const char *name,
const xmlChar **attrs,
int nb_attrs);
241 bool process_dimension_def(
const char *name,
const xmlChar **attrs,
int nb_attrs);
242 bool process_map(
const char *name,
const xmlChar **attrs,
int nb_attributes);
243 bool process_attribute(
const char *name,
const xmlChar **attrs,
int nb_attributes);
244 bool process_variable(
const char *name,
const xmlChar **attrs,
int nb_attributes);
245 bool process_group(
const char *name,
const xmlChar **attrs,
int nb_attributes);
246 bool process_enum_def(
const char *name,
const xmlChar **attrs,
int nb_attributes);
247 bool process_enum_const(
const char *name,
const xmlChar **attrs,
int nb_attributes);
249 void finish_variable(
const char *tag,
Type t,
const char *expected);
256 : d_dmr(0), d_enum_def(0), d_dim_def(0), other_xml(
""), other_xml_depth(0), unknown_depth(0), d_error_msg(
""),
257 d_context(0), dods_attr_name(
""), dods_attr_type(
""), char_data(
""), root_ns(
""), d_debug(false),
260 memset(&d_dmr_sax_parser, 0,
sizeof(xmlSAXHandler));
271 d_dmr_sax_parser.initialized = XML_SAX2_MAGIC;
278 void intern(
const string &document,
DMR *dest_dmr,
bool debug =
false);
279 void intern(
const char *buffer,
int size,
DMR *dest_dmr,
bool debug =
false);
303 static void dmr_start_element(
void *parser,
const xmlChar *localname,
const xmlChar *prefix,
const xmlChar *URI,
304 int nb_namespaces,
const xmlChar **namespaces,
int nb_attributes,
int nb_defaulted,
305 const xmlChar **attributes);
306 static void dmr_end_element(
void *parser,
const xmlChar *localname,
const xmlChar *prefix,
const xmlChar *URI);
310 static void dmr_get_cdata(
void *parser,
const xmlChar *value,
int len);
312 static xmlEntityPtr
dmr_get_entity(
void *parser,
const xmlChar *name);
314 static void dmr_error(
void *parser,
const char *msg, ...);
#define D4_PARSE_BUFF_SIZE
The basic data type for the DODS DAP types.
friend class D4ParserSax2Test
void intern(istream &f, DMR *dest_dmr, bool debug=false)
bool get_strict() const
Get the setting of the 'strict' mode.
static void dmr_start_document(void *parser)
static void dmr_start_element(void *parser, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI, int nb_namespaces, const xmlChar **namespaces, int nb_attributes, int nb_defaulted, const xmlChar **attributes)
XMLAttribute & operator=(const XMLAttribute &rhs)
static void dmr_ignoreable_whitespace(void *parser, const xmlChar *ch, int len)
static void dmr_error(void *parser, const char *msg,...)
static void dmr_end_element(void *parser, const xmlChar *localname, const xmlChar *prefix, const xmlChar *URI)
static void dmr_get_characters(void *parser, const xmlChar *ch, int len)
void clone(const XMLAttribute &src)
static void dmr_end_document(void *parser)
XMLAttribute(const xmlChar **attributes)
XMLAttribute(const XMLAttribute &rhs)
XMLAttribute(const string &p, const string &ns, const string &v)
void set_strict(bool s)
Set the 'strict' mode to true or false.
static void dmr_get_cdata(void *parser, const xmlChar *value, int len)
static xmlEntityPtr dmr_get_entity(void *parser, const xmlChar *name)
static void dmr_fatal_error(void *parser, const char *msg,...)
top level DAP object to house generic methods
Type
Identifies the data type.