(41) 9225-6319
contato@felipemarques.com.br

Como recuperar os atributos de um xml usando simple_xml_load_string do PHP 5

Olá pessoal,

Estava no trabalho, programando em PHP e mexendo com xmls para montagem de gráficos utilizando o software FUSION CHARTS quando me surgiu a necessidade de obter algumas informações dos atributos do xml que estavam na estrutura xml abaixo:

<graph caption="" subCaption="" baseFont="" baseFontSize="" baseFontColor="" bgcolor="" decimalPrecision="0" showPercentageValues="0" showPercentageInLabel="0" formatNumberScale="0" formatNumber="" pieYScale="60" pieBorderAlpha="40" pieFillAlpha="70" pieSliceDepth="15" pieRadius="110" showNames="0" showValues="1" numberPrefix="" numberSuffix="" decimalSeparator="" thousandSeparator="." showhovercap="" hoverCapBgColor="" hoverCapBorderColor="" hoverCapSepChar="">
<set name="Normal" value="89" hoverText="" link="" color="FF6600"/>
<set name="Normal 2" value="49" hoverText="" link="" color="FF8822"/>
</graph>

A leitura do xml era feita com o PHP 5 utilizando a função simplexml_load_string(), conforme código PHP abaixo:

<?php
$xml = '<graph caption="" subCaption="" baseFont="" baseFontSize="" baseFontColor="" bgcolor="" decimalPrecision="0" showPercentageValues="0" showPercentageInLabel="0" formatNumberScale="0" formatNumber="" pieYScale="60" pieBorderAlpha="40" pieFillAlpha="70" pieSliceDepth="15" pieRadius="110" showNames="0" showValues="1" numberPrefix="" numberSuffix="" decimalSeparator="" thousandSeparator="." showhovercap="" hoverCapBgColor="" hoverCapBorderColor="" hoverCapSepChar="">
<set name="Normal" value="89" hoverText="" link="" color="FF6600"/>
<set name="Normal 2" value="49" hoverText="" link="" color="FF8822"/>
</graph>';
$xml = stripslashes($xml);
$xml = simplexml_load_string($xml);

print_r($xml);
?>

A saída deste script seria algo como:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
             => 
            [subCaption] => 
            [baseFont] => 
            [baseFontSize] => 
            [baseFontColor] => 
            [bgcolor] => 
            [decimalPrecision] => 0
            [showPercentageValues] => 0
            [showPercentageInLabel] => 0
            [formatNumberScale] => 0
            [formatNumber] => 
            [pieYScale] => 60
            [pieBorderAlpha] => 40
            [pieFillAlpha] => 70
            [pieSliceDepth] => 15
            [pieRadius] => 110
            [showNames] => 0
            [showValues] => 1
            [numberPrefix] => 
            [numberSuffix] => 
            [decimalSeparator] => 
            [thousandSeparator] => .
            [showhovercap] => 
            [hoverCapBgColor] => 
            [hoverCapBorderColor] => 
            [hoverCapSepChar] => 
        )

    [set] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [name] => Normal
                            [value] => 89
                            [hoverText] => 
                            [link] => 
                            [color] => FF6600
                        )

                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [name] => Normal 2
                            [value] => 49
                            [hoverText] => 
                            [link] => 
                            [color] => FF8822
                        )

                )

        )

)

Aí então o próximo passo seria percorrer todos os sets para buscar os dados, pois queria montar uma legenda com o php, então fiz o seguinte:

<?php
$xml = '<graph caption="" subCaption="" baseFont="" baseFontSize="" baseFontColor="" bgcolor="" decimalPrecision="0" showPercentageValues="0" showPercentageInLabel="0" formatNumberScale="0" formatNumber="" pieYScale="60" pieBorderAlpha="40" pieFillAlpha="70" pieSliceDepth="15" pieRadius="110" showNames="0" showValues="1" numberPrefix="" numberSuffix="" decimalSeparator="" thousandSeparator="." showhovercap="" hoverCapBgColor="" hoverCapBorderColor="" hoverCapSepChar="">
<set name="Normal" value="89" hoverText="" link="" color="FF6600"/>
<set name="Normal 2" value="49" hoverText="" link="" color="FF8822"/>
</graph>';
$xml = stripslashes($xml);
$xml = simplexml_load_string($xml);

if(count($xml->set) > 0)
{
     foreach($xml->set as $set)
     {
          print_r($set);
     }
}
?>

Aí ficou fácil certo? A saída ficaria assim:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [name] => Normal
            [value] => 89
            [hoverText] => 
            [link] => 
            [color] => FF6600
        )

)
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [name] => Normal 2
            [value] => 49
            [hoverText] => 
            [link] => 
            [color] => FF8822
        )

)

Agora era só mexer com os dados da forma como eu quisesse, mas não foi bem assim. Eu tentei com o seguinte código abaixo imprimir o name de cada set ou seja:

<?php
$xml = '<graph caption="" subCaption="" baseFont="" baseFontSize="" baseFontColor="" bgcolor="" decimalPrecision="0" showPercentageValues="0" showPercentageInLabel="0" formatNumberScale="0" formatNumber="" pieYScale="60" pieBorderAlpha="40" pieFillAlpha="70" pieSliceDepth="15" pieRadius="110" showNames="0" showValues="1" numberPrefix="" numberSuffix="" decimalSeparator="" thousandSeparator="." showhovercap="" hoverCapBgColor="" hoverCapBorderColor="" hoverCapSepChar="">
<set name="Normal" value="89" hoverText="" link="" color="FF6600"/>
<set name="Normal 2" value="49" hoverText="" link="" color="FF8822"/>
</graph>';
$xml = stripslashes($xml);
$xml = simplexml_load_string($xml);

if(count($xml->set) > 0)
{
     foreach($xml->set as $set)
     {
         // tentei assim
         echo $set['@attributes']['name'];
         // e assim
         echo $set['@attributes']->name;
         // e assim
         echo $set->attributes->name;
     }
}
?>

Nenhum dos 3 echos acima retornou o dado requisitado, então fui até o site do php e acessei: http://br.php.net/manual/en/function.simplexml-load-string.php#72697.
Funcionou direitinho conforme o exemplo, mas estava um tanto feio o código e até mesmo complicado, então consegui resolver bem mais simples da seguinte maneira:

<?php
$xml = '<graph caption="" subCaption="" baseFont="" baseFontSize="" baseFontColor="" bgcolor="" decimalPrecision="0" showPercentageValues="0" showPercentageInLabel="0" formatNumberScale="0" formatNumber="" pieYScale="60" pieBorderAlpha="40" pieFillAlpha="70" pieSliceDepth="15" pieRadius="110" showNames="0" showValues="1" numberPrefix="" numberSuffix="" decimalSeparator="" thousandSeparator="." showhovercap="" hoverCapBgColor="" hoverCapBorderColor="" hoverCapSepChar="">
<set name="Normal" value="89" hoverText="" link="" color="FF6600"/>
<set name="Normal 2" value="49" hoverText="" link="" color="FF8822"/>
</graph>';
$xml = stripslashes($xml);
$xml = simplexml_load_string($xml);

if(count($xml->set) > 0)
{
     foreach($xml->set as $set)
     {
         // RESOLVIDO!!!!!
         echo (string) $set->Attributes()->name;
     }
}
?>

É isso ai pessoal, espero ter ajudado.
Quando eu econtrar outras dificuldades e conseguir resolvê-las postarei aqui para todos.

Obrigado pela visita!!! T+.

Sobre o autor
Felipe Marques é Consultor e Analista de Sistemas Web e Mobile. Mais de 10 anos de experiência.
Por :
Comentários : 1
  1. Hernani mattos Reply

    Cara,

    Salvou minha vida com esse post!

    Valeu mesmo!

    Parabéns!

Faça um comentário

*

Facebook Auto Publish Powered By : XYZScripts.com