233 class handler_wrapper
235 sax::detail::elem_scopes_type m_scopes;
236 sax::detail::ns_keys_type m_ns_keys;
237 sax::detail::entity_names_type m_attrs;
243 handler_type& m_handler;
248 handler_wrapper(
xmlns_context& ns_cxt, handler_type& handler) : m_ns_cxt(ns_cxt), m_handler(handler), m_declaration(false) {}
252 m_handler.doctype(dtd);
255 void start_declaration(std::string_view name)
257 m_declaration =
true;
258 m_handler.start_declaration(name);
261 void end_declaration(std::string_view name)
263 m_declaration =
false;
264 m_handler.end_declaration(name);
267 void start_element(
const sax::parser_element& elem)
269 m_scopes.emplace_back();
270 sax::detail::elem_scope& scope = m_scopes.back();
271 scope.ns = m_ns_cxt.get(elem.ns);
272 scope.name = elem.name;
273 scope.ns_keys.swap(m_ns_keys);
275 m_elem.ns = scope.ns;
276 m_elem.ns_alias = elem.ns;
277 m_elem.name = scope.name;
278 m_elem.begin_pos = elem.begin_pos;
279 m_elem.end_pos = elem.end_pos;
280 m_handler.start_element(m_elem);
285 void end_element(
const sax::parser_element& elem)
287 sax::detail::elem_scope& scope = m_scopes.back();
288 if (scope.ns != m_ns_cxt.get(elem.ns) || scope.name != elem.name)
289 throw malformed_xml_error(
"mis-matching closing element.", -1);
291 m_elem.ns = scope.ns;
292 m_elem.ns_alias = elem.ns;
293 m_elem.name = scope.name;
294 m_elem.begin_pos = elem.begin_pos;
295 m_elem.end_pos = elem.end_pos;
296 m_handler.end_element(m_elem);
299 for (
const std::string_view& key : scope.ns_keys)
305 void characters(std::string_view val,
bool transient)
307 m_handler.characters(val, transient);
310 void attribute(
const sax::parser_attribute& attr)
315 m_handler.attribute(attr.name, attr.value);
319 if (m_attrs.count(sax::detail::entity_name(attr.ns, attr.name)) > 0)
320 throw malformed_xml_error(
321 "You can't define two attributes of the same name in the same element.", -1);
323 m_attrs.insert(sax::detail::entity_name(attr.ns, attr.name));
325 if (attr.ns.empty() && attr.name ==
"xmlns")
328 m_ns_cxt.push(std::string_view{}, attr.value);
329 m_ns_keys.insert(std::string_view{});
333 if (attr.ns ==
"xmlns")
336 if (!attr.name.empty())
338 m_ns_cxt.push(attr.name, attr.value);
339 m_ns_keys.insert(attr.name);
344 m_attr.ns = attr.ns.empty() ? XMLNS_UNKNOWN_ID : m_ns_cxt.get(attr.ns);
345 m_attr.ns_alias = attr.ns;
346 m_attr.name = attr.name;
347 m_attr.value = attr.value;
348 m_attr.transient = attr.transient;
349 m_handler.attribute(m_attr);
354 handler_wrapper m_wrapper;
355 sax_parser<handler_wrapper> m_parser;
358template<
typename HandlerT>
359sax_ns_parser<HandlerT>::sax_ns_parser(
360 std::string_view content,
xmlns_context& ns_cxt, handler_type& handler) :
361 m_wrapper(ns_cxt, handler), m_parser(content, m_wrapper)
365template<
typename HandlerT>