    /*
     * call-seq:
     *   read
     *
     * Move the Reader forward through the XML document.
     */
    static VALUE read_more(VALUE self)
    {
      xmlTextReaderPtr reader;
      xmlErrorPtr error;
      VALUE error_list;
      int ret;

      Data_Get_Struct(self, xmlTextReader, reader);

      error_list = rb_funcall(self, rb_intern("errors"), 0);

      xmlSetStructuredErrorFunc((void *)error_list, Nokogiri_error_array_pusher);
      ret = xmlTextReaderRead(reader);
      xmlSetStructuredErrorFunc(NULL, NULL);

      if(ret == 1) return self;
      if(ret == 0) return Qnil;

      error = xmlGetLastError();
      if(error)
        rb_exc_raise(Nokogiri_wrap_xml_syntax_error((VALUE)NULL, error));
      else
        rb_raise(rb_eRuntimeError, "Error pulling: %d", ret);

      return Qnil;
    }