class Nokogiri::XML::SAX::PushParser
PushParser
can parse a document that is fed to it manually. It must be given a SAX::Document
object which will be called with SAX
events as the document is being parsed.
Calling PushParser#<<
writes XML
to the parser, calling any SAX
callbacks it can.
PushParser#finish
tells the parser that the document is finished and calls the end_document SAX
method.
Example:
parser = PushParser.new(Class.new(XML::SAX::Document) { def start_document puts "start document called" end }.new) parser << "<div>hello<" parser << "/div>" parser.finish
Attributes
The Nokogiri::XML::SAX::Document
on which the PushParser
will be operating
Public Class Methods
Create a new PushParser
with doc
as the SAX
Document
, providing an optional file_name
and encoding
# File lib/nokogiri/xml/sax/push_parser.rb, line 35 def initialize(doc = XML::SAX::Document.new, file_name = nil, encoding = 'UTF-8') @document = doc @encoding = encoding @sax_parser = XML::SAX::Parser.new(doc) ## Create our push parser context initialize_native(@sax_parser, file_name) end
Public Instance Methods
Finish the parsing. This method is only necessary for Nokogiri::XML::SAX::Document#end_document
to be called.
# File lib/nokogiri/xml/sax/push_parser.rb, line 55 def finish write '', true end
static VALUE get_options(VALUE self) { xmlParserCtxtPtr ctx; Data_Get_Struct(self, xmlParserCtxt, ctx); return INT2NUM(ctx->options); }
static VALUE set_options(VALUE self, VALUE options) { xmlParserCtxtPtr ctx; Data_Get_Struct(self, xmlParserCtxt, ctx); if (xmlCtxtUseOptions(ctx, (int)NUM2INT(options)) != 0) { rb_raise(rb_eRuntimeError, "Cannot set XML parser context options"); } return Qnil; }
Should this parser replace entities? & will get converted to '&' if set to true
static VALUE get_replace_entities(VALUE self) { xmlParserCtxtPtr ctx; Data_Get_Struct(self, xmlParserCtxt, ctx); if (0 == ctx->replaceEntities) { return Qfalse; } else { return Qtrue; } }
Should this parser replace entities? & will get converted to '&' if set to true
static VALUE set_replace_entities(VALUE self, VALUE value) { xmlParserCtxtPtr ctx; Data_Get_Struct(self, xmlParserCtxt, ctx); if (Qfalse == value) { ctx->replaceEntities = 0; } else { ctx->replaceEntities = 1; } return value; }
Write a chunk
of XML
to the PushParser
. Any callback methods that can be called will be called immediately.
# File lib/nokogiri/xml/sax/push_parser.rb, line 47 def write chunk, last_chunk = false native_write(chunk, last_chunk) end
Private Instance Methods
Initialize the push parser with xml_sax
using filename
static VALUE initialize_native(VALUE self, VALUE _xml_sax, VALUE _filename) { xmlSAXHandlerPtr sax; const char *filename = NULL; xmlParserCtxtPtr ctx; Data_Get_Struct(_xml_sax, xmlSAXHandler, sax); if (_filename != Qnil) { filename = StringValueCStr(_filename); } ctx = xmlCreatePushParserCtxt( sax, NULL, NULL, 0, filename ); if (ctx == NULL) { rb_raise(rb_eRuntimeError, "Could not create a parser context"); } ctx->userData = NOKOGIRI_SAX_TUPLE_NEW(ctx, self); ctx->sax2 = 1; DATA_PTR(self) = ctx; return self; }
Write chunk
to PushParser
. last_chunk
triggers the end_document handle
static VALUE native_write(VALUE self, VALUE _chunk, VALUE _last_chunk) { xmlParserCtxtPtr ctx; const char *chunk = NULL; int size = 0; Data_Get_Struct(self, xmlParserCtxt, ctx); if (Qnil != _chunk) { chunk = StringValuePtr(_chunk); size = (int)RSTRING_LEN(_chunk); } xmlSetStructuredErrorFunc(NULL, NULL); if (xmlParseChunk(ctx, chunk, size, Qtrue == _last_chunk ? 1 : 0)) { if (!(ctx->options & XML_PARSE_RECOVER)) { xmlErrorPtr e = xmlCtxtGetLastError(ctx); Nokogiri_error_raise(NULL, e); } } return self; }