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:
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>
Ho provato levenshtein e finediff ma forse sono io che non riesco a farlo funzionare.
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);
// }
}
}