class LibXML::XML::SaxParser
XML::SaxParser
provides a callback based API for parsing documents, in contrast to XML::Parser
‘s tree based API and XML::Reader
’s stream based API.
The XML::SaxParser
API is fairly complex, not well standardized, and does not directly support validation making entity, namespace and base processing relatively hard.
To use the XML::SaxParser
, register a callback class via the XML::SaxParser#callbacks=
. It is easiest to include the XML::SaxParser::Callbacks
module in your class and override the methods as needed.
Basic example:
class MyCallbacks include XML::SaxParser::Callbacks def on_start_element(element, attributes) puts #Element started: #{element}" end end parser = XML::SaxParser.string(my_string) parser.callbacks = MyCallbacks.new parser.parse
You can also parse strings (see XML::SaxParser.string
) and io objects (see XML::SaxParser.io
).
Attributes
Public Class Methods
Creates a new parser by parsing the specified file or uri.
# File lib/libxml/sax_parser.rb 10 def self.file(path) 11 context = XML::Parser::Context.file(path) 12 self.new(context) 13 end
Creates a new reader by parsing the specified io object.
Parameters:
encoding - The document encoding, defaults to nil. Valid values are the encoding constants defined on XML::Encoding.
# File lib/libxml/sax_parser.rb 25 def self.io(io, options = {}) 26 context = XML::Parser::Context.io(io) 27 context.encoding = options[:encoding] if options[:encoding] 28 self.new(context) 29 end
Creates a new XML::Parser
from the specified XML::Parser::Context
.
static VALUE rxml_sax_parser_initialize(int argc, VALUE *argv, VALUE self) { VALUE context = Qnil; rb_scan_args(argc, argv, "01", &context); if (context == Qnil) { rb_raise(rb_eArgError, "An instance of a XML::Parser::Context must be passed to XML::SaxParser.new"); } rb_ivar_set(self, CONTEXT_ATTR, context); return self; }
Creates a new parser by parsing the specified string.
# File lib/libxml/sax_parser.rb 35 def self.string(string) 36 context = XML::Parser::Context.string(string) 37 self.new(context) 38 end
Public Instance Methods
Parse the input XML
, generating callbacks to the object registered via the callbacks
attributesibute.
static VALUE rxml_sax_parser_parse(VALUE self) { VALUE context = rb_ivar_get(self, CONTEXT_ATTR); xmlParserCtxtPtr ctxt; Data_Get_Struct(context, xmlParserCtxt, ctxt); ctxt->sax2 = 1; ctxt->userData = (void*)rb_ivar_get(self, CALLBACKS_ATTR); memcpy(ctxt->sax, &rxml_sax_handler, sizeof(rxml_sax_handler)); int status = xmlParseDocument(ctxt); /* Now check the parsing result*/ if (status == -1 || !ctxt->wellFormed) { rxml_raise(&ctxt->lastError); } return Qtrue; }