protected function _installStates($xml)
 {
     if (isset($xml->states->state)) {
         foreach ($xml->states->state as $data) {
             $attributes = $data->attributes();
             if (!($id_state = State::getIdByName($attributes['name']))) {
                 $state = new State();
                 $state->name = strval($attributes['name']);
                 $state->iso_code = strval($attributes['iso_code']);
                 $state->id_country = Country::getByIso(strval($attributes['country']));
                 $state->id_zone = (int) Zone::getIdByName(strval($attributes['zone']));
                 if (!$state->validateFields()) {
                     $this->_errors[] = Tools::displayError('Invalid state properties.');
                     return false;
                 }
                 $country = new Country($state->id_country);
                 if (!$country->contains_states) {
                     $country->contains_states = 1;
                     if (!$country->update()) {
                         $this->_errors[] = Tools::displayError('Cannot update the associated country: ') . $country->name;
                     }
                 }
                 if (!$state->add()) {
                     $this->_errors[] = Tools::displayError('An error occurred while adding the state.');
                     return false;
                 }
             } else {
                 $state = new State($id_state);
                 if (!Validate::isLoadedObject($state)) {
                     $this->_errors[] = Tools::displayError('An error occurred while fetching the state.');
                     return false;
                 }
             }
             // Add counties
             foreach ($data->county as $xml_county) {
                 $county_attributes = $xml_county->attributes();
                 if (!($id_county = County::getIdCountyByNameAndIdState($county_attributes['name'], $state->id))) {
                     $county = new County();
                     $county->name = $county_attributes['name'];
                     $county->id_state = (int) $state->id;
                     $county->active = 1;
                     if (!$county->validateFields()) {
                         $this->_errors[] = Tools::displayError('Invalid County properties');
                         return false;
                     }
                     if (!$county->save()) {
                         $this->_errors[] = Tools::displayError('An error has occurred while adding the county');
                         return false;
                     }
                 } else {
                     $county = new County((int) $id_county);
                     if (!Validate::isLoadedObject($county)) {
                         $this->_errors[] = Tools::displayError('An error occurred while fetching the county.');
                         return false;
                     }
                 }
                 // add zip codes
                 foreach ($xml_county->zipcode as $xml_zipcode) {
                     $zipcode_attributes = $xml_zipcode->attributes();
                     $zipcodes = $zipcode_attributes['from'];
                     if (isset($zipcode_attributes['to'])) {
                         $zipcodes .= '-' . $zipcode_attributes['to'];
                     }
                     if ($county->isZipCodeRangePresent($zipcodes)) {
                         continue;
                     }
                     if (!$county->addZipCodes($zipcodes)) {
                         $this->_errors[] = Tools::displayError('An error has occurred while adding zipcodes');
                         return false;
                     }
                 }
             }
         }
     }
     return true;
 }