[ gotivac @ 23.10.2012. 10:55 ] @
Imam jedan problem koji umem da rešim, ali rešenje koje mi je palo na pamet radi previše sporo. Radi se o aplikaciji koja se vrti na standardnoj LAMP konfiguraciji, i za koju je potrebno napraviti modul preko koga će korisnik jednom sedmično učitavati veliki xml fajl - radi se o tabeli osiguranika RFZO. XML fajl ima sledeću strukturu: Code: <?xml version="1.0" encoding="windows-1250"?> <Osiguranici> <Osiguranik> <Filijala><![CDATA[ *******]]></Filijala> <Ispostava><![CDATA[ *******]]></Ispostava> <LBO><![CDATA[*******]]></LBO> <BrojKnjizice><![CDATA[*******]]></BrojKnjizice> <JMBG><![CDATA[*******]]></JMBG> <Prezime><![CDATA[*******]]></Prezime> <Ime><![CDATA[*******]]></Ime> <OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja> </Osiguranik> <Osiguranik> <Filijala><![CDATA[ *******]]></Filijala> <Ispostava><![CDATA[ *******]]></Ispostava> <LBO><![CDATA[*******]]></LBO> <BrojKnjizice><![CDATA[*******]]></BrojKnjizice> <JMBG><![CDATA[*******]]></JMBG> <Prezime><![CDATA[*******]]></Prezime> <Ime><![CDATA[*******]]></Ime> <OsnovOsiguranja><![CDATA[*******]]></OsnovOsiguranja> </Osiguranik> ... i tako dalje... </Osiguranici> (Zvezdice su naravno umesto pravih podataka osiguranika). Pokušao sam ovo da rešim na dva načina - prvi je uz pomoć samog MySQL-a, to jest komande LOAD XML INFILE ... ali to neće da radi zbog ovih CDATA gluposti. Drugi način koji radi bez problema je preko simplexml_load_file, ali tu sad nastaje frka. Nisam hteo da čitam slog po slog pa da ga upisujem u bazu, jer bi to za 300000 slogova bilo isto toliko INSERT INTO komandi, pa sam pokušao da pravim jedan string, nešto ovako: Code: $sql = 'INSERT INTO insured (branch, substation, insurance_number, insurance_card, citizen_number, name, surname, insurance_basis) VALUES '; $xml=simplexml_load_file('KR.xml'); foreach ($xml->children() as $osiguranik) { $sql .= '('; foreach($osiguranik as $row) { $sql .= "'$row', "; } $sql = substr($sql,0,-2) . '), '; } $sql = substr($sql,0,-2); $db->sql = $sql; $db->exec(); Mislim da ovo radi - ne mogu sa sigurnošću da tvrdim jer sam ga pustio pre otprilike 50 minuta i još uvek nije završio. :D Ima li neko ideju kako ovo može da se odradi brže? |