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.
⚠ Note that empty documents are treated as an error when using the libxml2-based implementation (CRuby), but are fine when using the Xerces-based implementation (JRuby).
# File lib/nokogiri/xml/sax/push_parser.rb, line 58 def finish write("", true) end
static VALUE noko_xml_sax_push_parser__options_get(VALUE self) { xmlParserCtxtPtr ctx; ctx = noko_xml_sax_push_parser_unwrap(self); return INT2NUM(xmlCtxtGetOptions(ctx)); }
static VALUE noko_xml_sax_push_parser__options_set(VALUE self, VALUE options) { int error; xmlParserCtxtPtr ctx; ctx = noko_xml_sax_push_parser_unwrap(self); error = xmlCtxtSetOptions(ctx, (int)NUM2INT(options)); if (error) { rb_raise(rb_eRuntimeError, "Cannot set XML parser context options (%x)", error); } return Qnil; }
See Entity Handling at Document
for an explanation of the behavior controlled by this flag.
- Returns
-
(Boolean) Value of the parse option. (Default
false
)
This option is perhaps misnamed by the libxml2 author, since it controls resolution and not replacement.
static VALUE noko_xml_sax_push_parser__replace_entities_get(VALUE self) { xmlParserCtxtPtr ctxt = noko_xml_sax_push_parser_unwrap(self); if (xmlCtxtGetOptions(ctxt) & XML_PARSE_NOENT) { return Qtrue; } else { return Qfalse; } }
See Entity Handling at Document
for an explanation of the behavior controlled by this flag.
- Parameters
-
value
(Boolean) Whether external parsed entities will be resolved.
⚠ It is UNSAFE to set this option to true
when parsing untrusted documents. The option defaults to false
for this reason.
This option is perhaps misnamed by the libxml2 author, since it controls resolution and not replacement.
static VALUE noko_xml_sax_push_parser__replace_entities_set(VALUE self, VALUE value) { int error; xmlParserCtxtPtr ctxt = noko_xml_sax_push_parser_unwrap(self); if (RB_TEST(value)) { error = xmlCtxtSetOptions(ctxt, xmlCtxtGetOptions(ctxt) | XML_PARSE_NOENT); } else { error = xmlCtxtSetOptions(ctxt, xmlCtxtGetOptions(ctxt) & ~XML_PARSE_NOENT); } if (error) { rb_raise(rb_eRuntimeError, "failed to set parser context options (%x)", error); } 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