Buongiorno,
avrei bisogno di trovare il modo di estrarre il campo ID da un file xml e se nel campo testuale c'è il testo "simile" (in cui magari cambiano solo da 1 alle 4 parole) prelevare il suo campo Id e fallo puntare all' id del secondo XML creando una sorta di mappa fatta da id1=>id2 in cui al primo id corrisponde il secondo in cui c'è la stessa frase o leggermente diversa salvato in un txt.
Ho utilizzato PHP per estrarre i 2 XML e ho anche buttato tutto su un DB sql e così facendo ho trovato le stringhe uguali.
Ho provato a utilizzare poi cose come levenshtein, str_pos ecc. ma con scarsi risultati.
Gli XML hanno struttura simile e hanno da controllare 4956 record e hanno la seguente struttura:
Ho provato levenshtein e finediff ma forse sono io che non riesco a farlo funzionare.codice:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DATAPACKET Version="2.0"> <METADATA> <FIELDS> <FIELD> <FIELD> <FIELD> <FIELD>... </FIELDS> <PARAMS AUTOINCVALUE="5543"/> </METADATA> <ROWDATA> <ROW Id="1" Blocco="01001" Domanda="01" Risposta="TRUE" Capitolo="01" Indice="A01" Argomento="A" SubArgomento="1" Figura="" FiguraBlk="" Difficolta="3" Testo="............." Audio1="07001_70001" Info1="" Gruppo1="1256"/> </ROWDATA> </DATAPACKET>
Qualcuno ha delle idee su come trovare le stringhe che si "assomigliano di più" tra due file? Ho già messo i file in array multidim con 3 campi, id,testo e risposta.
Dovrei provare a vedere se hanno campo Testo il più uguale possibile, e il valore di risposta(TRUE o FALSE) uguale. A questo punto stampo un file con ID_xml1=> ID_xml2.
Idee?
Qui di seguito il codice per trasformare xml in array e qualche tentativo:
codice:if (file_exists('QQM2015.XML')) { // $xml1 = simplexml_load_file('QQM2015.XML'); // $xml2 = simplexml_load_file('QQM2021.XML'); $xml1 = "QQM2015.XML"; $xml2 = "QQM2021.XML"; /* $xml1 = "x1.XML"; $xml2 = "x2.XML";*/ xml_to_array($xml1,$xml2,$conn); // echo(json_encode($arr_finale_xml1)."\r\n"); } else { exit('Failed to open test.xml.'); } function xml_to_array($xml1,$xml2,$conn){ $content1 = utf8_encode(file_get_contents($xml1)); $content2 = utf8_encode(file_get_contents($xml2)); //$xmlfile = file_get_contents($xml1); $ob1= simplexml_load_string($content1); $ob2= simplexml_load_string($content2); $json1 = json_encode($ob1); $json2 = json_encode($ob2); $configData1 = json_decode($json1, true); $configData2 = json_decode($json2, true); // echo "<pre>"; $array_tot1=array(); $array_id1=array(); $array_rx1=array(); $array_tot2=array(); $array_id2=array(); $array_rx2=array(); for($i=0;$i<sizeof($configData1["ROWDATA"]["ROW"]);$i++){ //echo(json_encode($configData["ROWDATA"]["ROW"][0]["@attributes"]["Testo"])."\n\r"); array_push($array_tot1,$configData1["ROWDATA"]["ROW"][$i]["@attributes"]["Testo"]); array_push($array_id1,$configData1["ROWDATA"]["ROW"][$i]["@attributes"]["Id"]); array_push($array_rx1,$configData1["ROWDATA"]["ROW"][$i]["@attributes"]["Risposta"]); } for($m=0;$m<sizeof($configData2["ROWDATA"]["ROW"]);$m++){ //echo(json_encode($configData["ROWDATA"]["ROW"][0]["@attributes"]["Testo"])."\n\r"); array_push($array_tot2,$configData2["ROWDATA"]["ROW"][$m]["@attributes"]["Testo"]); array_push($array_id2,$configData2["ROWDATA"]["ROW"][$m]["@attributes"]["Id"]); array_push($array_rx2,$configData2["ROWDATA"]["ROW"][$m]["@attributes"]["Risposta"]); } $arr_finale_xml1=array(); $arr_finale_xml2=array(); for($j=0;$j<sizeof($array_tot1);$j++){ $arr_fin1=array( "id"=>$array_id1[$j], "Testo"=>$array_tot1[$j], "Risposta"=>$array_rx1[$j] ); array_push($arr_finale_xml1,$arr_fin1); } for($k=0;$k<sizeof($array_tot2);$k++){ $arr_fin2=array( "id"=>$array_id2[$k], "Testo"=> $array_tot2[$k], "Risposta"=> $array_rx2[$k] ); array_push($arr_finale_xml2,$arr_fin2); } finediff($conn,$arr_finale_xml1,$arr_finale_xml2); } function finediff($conn,$arr_finale_xml1,$arr_finale_xml2){ $result=array(); for($i=0;$i<sizeof($arr_finale_xml1);$i++){ $t1= $arr_finale_xml1[$i]["Testo"]; $t1rx= $arr_finale_xml1[$i]["Risposta"]; $t1=str_replace(" ","",$t1); $arr_fin2=array(); for($j=0;$j<sizeof($arr_finale_xml2);$j++){ $t2=$arr_finale_xml2[$j]["Testo"]; $t2rx= $arr_finale_xml2[$j]["Risposta"]; $t2=str_replace(" ","",$t2); array_push($arr_fin2,$arr_finale_xml2[$j]); // $diff_opcodes = FineDiff::getDiffOpcodes($t1, $t2); //$opcodes = FineDiff::getDiffOpcodes($arr_finale_xml1[$i]["Testo"], $arr_finale_xml2[$j]["Testo"],FineDiff::$wordGranularity); } $pippo=function ($a,$b) use ($t1){ $pino=FineDiff::getDiffOpcodes($t1,$a["Testo"]); $pluto=FineDiff::getDiffOpcodes($t1,$b["Testo"]); $result1=countdiff($pino); $result2=countdiff($pluto); $differenza=$result1-$result2; return $differenza; }; usort($arr_fin2,$pippo); file_put_contents("mappa_pippo.txt","'".$arr_finale_xml1[$i]["id"]."'=>". json_encode($arr_fin2[0]["id"]).PHP_EOL,FILE_APPEND); // if(!in_array($arr_fin2,$result)){ // $result=array_slice($arr_fin2,0,5); // file_put_contents("mappa_pippo.txt", json_encode($result).PHP_EOL.PHP_EOL,FILE_APPEND); // } } }

Rispondi quotando
