Mais uma quinta e mais um artigo para os interessados em PHP. A nível de direitos sobre o código, devo remeter-vos para o meu primeiro artigo desta rubrica aqui
Hoje trago-vos uma função que já me ajudou no passado, num projecto em que só podia trabalhar com PHP4 e tinha de fazer parsing de um ficheiro XML cuja sintaxe era conhecida.
Em PHP4 não existe a função simple_xml_load_string.
Esta função também pode ser usada em PHP5 quando o ficheiro XML não tem atributos, etc. pois usa menos recursos (dado que é menos dinâmica e menos complexa) do que a função que referi em cima.
<?php
function parseXMLtoObject($xml) {
$obj = new stdClass();
$xml = explode("\n",$xml);
$main_n = '';
foreach ($xml as $x) {
$first_n = false;
$close_n = false;
if ($x != '') {
$start_val = (strpos($x,">")+1);
$end_val = strrpos($x,"<") - $start_val;
$start_n = (strpos($x,"<")+1);
$end_n = strpos($x,">") - $start_n;
$n = strtolower(substr($x,$start_n,$end_n));
if (substr_count($x,"<") == 1) {
if (!empty($main_n) && !stristr($n,"/")) {
$submain_n = $n;
$first_n = true;
} else {
$main_n = $n;
$submain_n = '';
$first_n = true;
}
}
if (!empty($submain_n) && stristr($submain_n,"/")) {
$submain_n = '';
$first_n = false;
$close_n = true;
}
if (!empty($main_n) && stristr($main_n,"/")) {
$main_n = '';
$submain_n = '';
$first_n = false;
$close_n = true;
}
$value = substr($x,$start_val,$end_val);
if (!$close_n) {
if (empty($main_n)) {
$obj->$n = $value;
} else {
if ($first_n) {
if (empty($submain_n)) {
$obj->$main_n = new stdClass();
} else {
$obj->$main_n->$submain_n = new stdClass();
}
} else {
if (!empty($value)) {
if (empty($submain_n)) {
$obj->$main_n->$n = $value;
} else {
$obj->$main_n->$submain_n->$n = $value;
}
}
}
}
}
}
}
return $obj;
}
?>
Modo de utilização:
Converter Ficheiro XML $a para Object $o
<?php $a = “ficheiro.xml”; $xml = file_get_cont ents($a); $o = parseXMLtoObject($xml); //-- Agora podem visualizar a estrutura do $o desta forma: echo “<pre>”;print_r($o);echo “</pre>”;//-- Imprime a estrutura do objecto $o ?>
Qualquer dúvida ou sugestão, estão completamente à vontade.