PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

Funções da SimpleXML> <Constantes pré-definidas
Last updated: Fri, 22 Aug 2008

view this page in

Exemplos

Muitos exemplos vistos aqui requerem uma string XML. Ao invés de ficar repetindo esta string em cada exemplo, vamos colocá-la em um arquivo que iremos incluir em cada exemplo. Este arquivo é mostrado no exemplo a seguir. Porém, você pode criar um document XML e lê-lo utilizando simplexml_load_file().

Exemplo #1 Arquivo example.php com uma string XML

<?php
$xmlstr 
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#211;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>
XML;
?>

A simplicidade do SimpleXML aparece mais claramente quando extraímos uma string ou um número de um documento XML básico.

Exemplo #2 Getting <plot>

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie[0]->plot// "So this language. It's like..."
?>

A tarefa de acessar elementos de dentro de um documento XML que contêm caracteres não permitidos pela a convenção de nomes do PHP (por exemplo, o hífen) pode ser feita encapsulando o elemento com chaves e apóstrofos.

Exemplo #3 Obtendo <line>

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie->{'great-lines'}->line// "PHP solves all my web problems"
?>

Exemplo #4 Acessando elementos não-únicos no SimpleXML

Caso existam nós filhos com nomes iguais dentro de um mesmo nó pai, aplica-se a iteração normal.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* For each <movie> node, we echo a separate <plot>. */
foreach ($xml->movie as $movie) {
   echo 
$movie->plot'<br />';
}

?>

Exemplo #5 Utilizando atributos

Até agora, só cobrimos o trabalho de ler o nome dos elementos e os seus valores. SimpleXML pode também acessar o atributo dos elementos. Acessar os atributos de um elemento é tão simples quando acessar os atributos de uma array.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* Access the <rating> nodes of the first movie.
 * Output the rating scale, too. */
foreach ($xml->movie[0]->rating as $rating) {
    switch((string) 
$rating['type']) { // Get attributes as element indices
    
case 'thumbs':
        echo 
$rating' thumbs up';
        break;
    case 
'stars':
        echo 
$rating' stars';
        break;
    }
}
?>

Exemplo #6 Comparando elementos e atributos com texto

Para comparar um elemento ou atributo com uma string ou passar para uma função que requer uma string, você deve converter para uma string utilizando (string). De outra forma, o PHP irá tratar este elemento como um objeto.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

if ((string) 
$xml->movie->title == 'PHP: Behind the Parser') {
    print 
'My favorite movie.';
}

htmlentities((string) $xml->movie->title);
?>

Exemplo #7 Utilizando XPath

SimpleXML possui suporte a XPath embutido. Para encontrar todos os elementos <character>:

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

foreach (
$xml->xpath('//character') as $character) {
    echo 
$character->name'played by '$character->actor'<br />';
}
?>

'//' serve como uma wildcard. Para especificar um caminho absoluto, basta omitir uma das barras.

Exemplo #8 Atribuindo valores

Dados no SimpleXML não precisam ser constantes, necesseariamente. O objeto permite a manipulação de todos os seus elementos.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$xml->movie[0]->characters->character[0]->name 'Miss Coder';

echo 
$xml->asXML();
?>

O código acima irá mostrar um novo documento XML, como o original, exceto que o novo irá trocar Ms. Coder por Miss Coder.

Exemplo #9 Adicionando elementos e atributos

Desde o PHP 5.1.3, SimpleXML possui a habilidade de adicionar atributos e nós filhos facilmente.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$character $xml->movie[0]->characters->addChild('character');
$character->addChild('name''Mr. Parser');
$character->addChild('actor''John Doe');

$rating $xml->movie[0]->addChild('rating''PG');
$rating->addAttribute('type''mpaa');

echo 
$xml->asXML();
?>

O código acima irá mostrar um documento XML baseado no original, mas contendo um novo personagem e um novo rating.

Exemplo #10 Interoperabilidade DOM

PHP possui um mecanismo para converter nós XML entre os formatos SimpleXML e DOM. Este exemplo mostra como mudar um elemento DOM para SimpleXML.

<?php
$dom 
= new domDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!
$dom) {
     echo 
'Error while parsing the document';
     exit;
}

$s simplexml_import_dom($dom);

echo 
$s->book[0]->title;
?>



Funções da SimpleXML> <Constantes pré-definidas
Last updated: Fri, 22 Aug 2008
 
add a note add a note User Contributed Notes
Exemplos
Kari P.
15-Aug-2008 11:17
To take care of proper error checking, one must use try-catch blocks:

<?php
try
{
 
$sxe = new SimpleXMLElement($xmlstring);
}
catch (Exception $e) {
  echo
"bad xml";
}
?>

To get rid of warnings, use @ in front of new:

<?php
try
{
 
$sxe = @new SimpleXMLElement($xmlstring);
}
catch (Exception $e) {
  echo
"bad xml";
}
?>
dipl dot paed dot thomas dot schaefer at web dot de
03-May-2008 06:57
<?php
class QXML {
  ...
 
protected function _toXML(
   
$xmlArray,
   
$elmName='graph',
   
$elmCloseTag="",
   
$level=0)
  {
   
$xmlString = "";
    if(
is_array($xmlArray)){
     
$strXmlAttributes = "";
     
$key_xml = "";
     
$keysXmlArray = array_keys($xmlArray);
     
$curLevel = $level + 1;
      if(
in_array(self::attribute,$keysXmlArray)){
        if(isset(
$xmlArray[self::attribute])){
          if(
is_array($xmlArray[self::attribute])){
            foreach(
$xmlArray[self::attribute]
              as
$xmlArrayKey => $xmlArrayValue)
            {
             
$strXmlAttributes .= sprintf(' %s="%s"',
                                   
$xmlArrayKey,
                                   
addslashes($xmlArrayValue));
            }
          }
        }
        unset(
$xmlArray[self::attribute]);
      }
      if(
in_array(self::textNode,$keysXmlArray)){
        if(isset(
$xmlArray[self::textNode])){
          if(
$xmlArray[self::textNode]){
           
$key_xml = $xmlArray[self::textNode];
          }
          if(
strlen($ky_xml)){
           
$key_xml = sprintf("<![CDATA[%s]]>",$key_xml);
          } else {
           
$key_xml = "";
          }
        }
        unset(
$xmlArray[self::textNode]);
      }
     
$keysXmlArray=array_keys($xmlArray);
      if(
$elmCloseTag){
       
$indent=str_repeat(" ",$level * 5);
       
$xmlString  .="\n".$indent.
                   
"<".$elmCloseTag.$strXmlAttributes.">".
                   
$key_xml;
      }
      if(
is_array($xmlArray) && count($xmlArray)>0
       
&& count($keysXmlArray)>0)
      {
       
reset($xmlArray);
        foreach(
$keysXmlArray as $key){
         
$altKey = $altKeyXml = $xmlArray[$key];
         
$check = false;
          foreach(
array_keys($altKeyXml) as $j=>$p){
            if(
is_numeric($j)){
             
$check=true;
             
$xmlString.= $this->_toXML(
               
$altKeyXml[$j],
               
"",
               
$key,
               
$curLevel
             
);
              unset(
$altKeyXml[$j]);
            }
          }
          if(
$check){
           
$altKey = $altKeyXml;
          }
          if(
$altKey){
           
$xmlString .= $this->_toXML($altKey,"",$key,$curLevel);
          }
        }
      }
      if(
$elmCloseTag){
       
$xmlString.= (count($xmlArray)>0?"\n".$indent:"").
                    
"</".$elmCloseTag.">";
      }
    }

    if(
$elmName) {
     
$xmlString = "<?xml version='1.0' encoding='UTF-8'?>\n$xmlString\n";
    }
    return
$xmlString;
  }

...
}
?>
Honeymonster
30-Apr-2008 03:52
@david b
@Fabi W

Why can't you use the ->{} operators?

e.g

$xml->{$node}

I've not tested this, but see no reason why it would not work.
Fabi W
23-Apr-2008 09:34
@david b's approach of dynamically accessing xml-elements:

You can explode the dynamic var with '->' as seperator and thus build a simple function to get the element

function simplexml_get_node_by_query($sxml_obj, $query)
{
      $nodes = explode("->", $query);
      $currTree = $sxml_obj;

      foreach($nodes as $node)
      {
        $currTree = $currTree->$node;
      }
      return $currTree;
}
mike at mike-griffiths dot co dot uk
18-Apr-2008 06:11
It is important that you select the correct method of loading the XML in depending on the format of your XML file.

If you use the wrong function to load it in you will get some strange errors.
david b
13-Apr-2008 12:04
Use eval() when using variable variables to access SimpleXML nodes.
e.g.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

$s = 'movie[0]->plot' ;

echo
"\n1: OK   " . $xml->movie[0]->plot ;   // OK
echo "\n2: FAIL " . $xml->$s ;               // FAIL
echo "\n3: OK   " . eval( "return  \$xml->$s ;" ) ;    // OK

?>

Funções da SimpleXML> <Constantes pré-definidas
Last updated: Fri, 22 Aug 2008
 
 
show source | credits | stats | sitemap | contact | advertising | mirror sites