26 #ifndef d4_parser_sax2_h 27 #define d4_parser_sax2_h 38 #include <libxml/parserInternals.h> 47 class D4BaseTypeFactory;
90 inside_attribute_container,
92 inside_attribute_value,
93 inside_other_xml_attribute,
118 xmlSAXHandler ddx_sax_parser;
123 DMR *dmr()
const {
return d_dmr; }
127 void push_state(D4ParserSax2::ParseState state) { s.push(state); }
128 D4ParserSax2::ParseState get_state()
const {
return s.top(); }
129 void pop_state() { s.pop(); }
130 bool empty_state()
const {
return s.empty(); }
132 stack<BaseType*> btp_stack;
133 void push_basetype(
BaseType *btp) { btp_stack.push(btp); }
134 BaseType *top_basetype()
const {
return btp_stack.top(); }
135 void pop_basetype() { btp_stack.pop(); }
136 bool empty_basetype()
const {
return btp_stack.empty(); }
138 stack<D4Group*> grp_stack;
139 void push_group(
D4Group *grp) { grp_stack.push(grp); }
140 D4Group *top_group()
const {
return grp_stack.top(); }
141 void pop_group() { grp_stack.pop(); }
142 bool empty_group()
const {
return grp_stack.empty(); }
144 stack<D4Attributes*> d_attrs_stack;
145 void push_attributes(
D4Attributes *attr) { d_attrs_stack.push(attr); }
146 D4Attributes *top_attributes()
const {
return d_attrs_stack.top(); }
147 void pop_attributes() { d_attrs_stack.pop(); }
148 bool empty_attributes()
const {
return d_attrs_stack.empty(); }
154 if (!d_enum_def) d_enum_def =
new D4EnumDef;
158 void clear_enum_def() { d_enum_def = 0; }
168 void clear_dim_def() { d_dim_def = 0; }
175 unsigned int other_xml_depth;
176 unsigned int unknown_depth;
180 xmlParserCtxtPtr context;
183 string dods_attr_name;
184 string dods_attr_type;
189 bool debug()
const {
return d_debug; }
197 void clone(
const XMLAttribute &src) {
203 XMLAttribute() : prefix(
""), nsURI(
""), value(
"") {}
204 XMLAttribute(
const string &p,
const string &ns,
const string &v)
205 : prefix(p), nsURI(ns), value(v) {}
208 XMLAttribute(
const xmlChar **attributes) {
209 prefix = attributes[0] != 0 ? (
const char *)attributes[0]:
"";
210 nsURI = attributes[1] != 0 ? (
const char *)attributes[1]:
"";
211 value = string((
const char *)attributes[2], (
const char *)attributes[3]);
213 XMLAttribute(
const XMLAttribute &rhs) {
216 XMLAttribute &operator=(
const XMLAttribute &rhs) {
224 typedef map<string, XMLAttribute> XMLAttrMap;
225 XMLAttrMap xml_attrs;
227 XMLAttrMap::iterator xml_attr_begin() {
return xml_attrs.begin(); }
229 XMLAttrMap::iterator xml_attr_end() {
return xml_attrs.end(); }
231 map<string, string> namespace_table;
233 void cleanup_parse();
241 void transfer_xml_attrs(
const xmlChar **attrs,
int nb_attributes);
242 void transfer_xml_ns(
const xmlChar **namespaces,
int nb_namespaces);
243 bool check_required_attribute(
const string &attr);
244 bool check_attribute(
const string & attr);
245 void process_variable_helper(
Type t, ParseState s,
const xmlChar **attrs,
int nb_attributes);
247 void process_enum_const_helper(
const xmlChar **attrs,
int nb_attributes);
248 void process_enum_def_helper(
const xmlChar **attrs,
int nb_attributes);
250 bool process_dimension(
const char *name,
const xmlChar **attrs,
int nb_attrs);
251 bool process_dimension_def(
const char *name,
const xmlChar **attrs,
int nb_attrs);
252 bool process_map(
const char *name,
const xmlChar **attrs,
int nb_attributes);
253 bool process_attribute(
const char *name,
const xmlChar **attrs,
int nb_attributes);
254 bool process_variable(
const char *name,
const xmlChar **attrs,
int nb_attributes);
255 bool process_group(
const char *name,
const xmlChar **attrs,
int nb_attributes);
256 bool process_enum_def(
const char *name,
const xmlChar **attrs,
int nb_attributes);
257 bool process_enum_const(
const char *name,
const xmlChar **attrs,
int nb_attributes);
259 void finish_variable(
const char *tag,
Type t,
const char *expected);
262 friend class D4ParserSax2Test;
266 d_dmr(0), d_enum_def(0), d_dim_def(0),
267 other_xml(
""), other_xml_depth(0), unknown_depth(0),
268 error_msg(
""), context(0),
269 dods_attr_name(
""), dods_attr_type(
""),
270 char_data(
""), root_ns(
""), d_debug(
false)
273 memset(&ddx_sax_parser, 0,
sizeof(xmlSAXHandler));
281 ddx_sax_parser.warning = &D4ParserSax2::dmr_error;
282 ddx_sax_parser.error = &D4ParserSax2::dmr_error;
284 ddx_sax_parser.initialized = XML_SAX2_MAGIC;
285 ddx_sax_parser.startElementNs = &D4ParserSax2::dmr_start_element;
286 ddx_sax_parser.endElementNs = &D4ParserSax2::dmr_end_element;
289 void intern(istream &f,
DMR *dest_dmr,
bool debug =
false);
290 void intern(
const string &document,
DMR *dest_dmr,
bool debug =
false);
291 void intern(
const char *buffer,
int size,
DMR *dest_dmr,
bool debug =
false);
296 static void dmr_start_element(
void *parser,
297 const xmlChar *localname,
const xmlChar *prefix,
const xmlChar *URI,
298 int nb_namespaces,
const xmlChar **namespaces,
int nb_attributes,
299 int nb_defaulted,
const xmlChar **attributes);
300 static void dmr_end_element(
void *parser,
const xmlChar *localname,
301 const xmlChar *prefix,
const xmlChar *URI);
305 const xmlChar * ch,
int len);
306 static void dmr_get_cdata(
void *parser,
const xmlChar *value,
int len);
308 static xmlEntityPtr
dmr_get_entity(
void *parser,
const xmlChar *name);
310 static void dmr_error(
void *parser,
const char *msg, ...);
315 #endif // d4_parser_sax2_h static void dmr_end_document(void *parser)
static void dmr_start_document(void *parser)
static xmlEntityPtr dmr_get_entity(void *parser, const xmlChar *name)
Type
Identifies the data type.
static void dmr_ignoreable_whitespace(void *parser, const xmlChar *ch, int len)
static void dmr_get_cdata(void *parser, const xmlChar *value, int len)
static void dmr_get_characters(void *parser, const xmlChar *ch, int len)
The basic data type for the DODS DAP types.
static void dmr_fatal_error(void *parser, const char *msg,...)