Pergunta

Vamos dizer que tenho alguns XML como este

<channel>
  <item>
    <title>This is title 1</title>
  </item>
</channel>

O código a seguir faz o que eu quero em que ela exiba o título como uma string

$xml = simplexml_load_string($xmlstring);
echo $xml->channel->item->title;

Aqui está o meu problema. O código abaixo não trata a título como uma cadeia de caracteres em que contexto assim o termino-se com um objeto SimpleXML na matriz, em vez de uma cadeia.

$foo = array( $xml->channel->item->title );

Eu tenho trabalhado em torno dele como esta

$foo = array( sprintf("%s",$xml->channel->item->title) );

mas que parece feio.

Qual é a melhor maneira de forçar um objeto SimpleXML para uma cadeia, independentemente do contexto?

Foi útil?

Solução

Typecast o SimpleXMLObject para uma string:

$foo = array( (string) $xml->channel->item->title );

O código acima chama internamente __toString() na SimpleXMLObject. Este método não está disponível ao público, já que interfere com o esquema de mapeação do SimpleXMLObject, mas ainda pode ser invocada no modo acima.

Outras dicas

Você pode usar a função PHP

strval();

Esta função retorna os valores de cadeia do parâmetro passado para ele.

Há método SimpleXML nativo SimpleXMLElement :: asXML Dependendo parâmetro escreve SimpleXMLElement para arquivo XML 1.0 ou apenas para uma string:

$xml = new SimpleXMLElement($string);
$validfilename = '/temp/mylist.xml';
$xml->asXML($validfilename);    // to a file
echo $xml->asXML();             // to a string

Outra forma feia para fazê-lo:

$foo = array( $xml->channel->item->title."" );

Ele funciona, mas não é bonito.

Para obter dados XML em uma matriz de php que você faça o seguinte:

// this gets all the outer levels into an associative php array
$header = array();
foreach($xml->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($header);
echo "</pre>";

Para obter uma criança da criança, em seguida, basta fazer o seguinte:

$data = array();
foreach($xml->data->children() as $child)
{
  $header[$child->getName()] = sprintf("%s", $child); 
}
echo "<pre>\n";
print_r($data);
echo "</pre>";

Você pode expandir $ XML-> através de cada nível até conseguir o que você quer Você também pode colocar todos os nós em um array sem os níveis ou apenas sobre qualquer outro jeito que você quiser.

A resposta aceita realmente retorna um array contendo uma corda, o que não é exatamente o OP solicitado (a string). Para expandir essa resposta, use:

$foo = [ (string) $xml->channel->item->title ][0];

que retorna o único elemento da matriz, uma string.

Tente strval ($ XML-> CANAL> item-> título)

Não tenho certeza se eles mudaram a visibilidade do método __toString() desde a resposta aceita foi escrito, mas neste momento ele funciona muito bem para mim:

var_dump($xml->channel->item->title->__toString());

SAÍDA:

string(15) "This is title 1"

Não é nativo SimpleXML método SimpleXMLElement :: asXML Dependendo parâmetro escreve SimpleXMLElement para arquivo XML 1.0, Sim

$get_file= read file from path;
$itrate1=$get_file->node;
$html  = $itrate1->richcontent->html;


echo  $itrate1->richcontent->html->body->asXML();
 print_r((string) $itrate1->richcontent->html->body->asXML());

A seguir é uma função recursiva que vai typecast todos os elementos-filho único para um String:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// FUNCTION - CLEAN SIMPLE XML OBJECT
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function cleanSimpleXML($xmlObject = ''){

    // LOOP CHILDREN
    foreach ($xmlObject->children() as $child) {

        // IF CONTAINS MULTIPLE CHILDREN
        if(count($child->children()) > 1 ){

            // RECURSE
            $child = cleanSimpleXML($child);

        }else{

            // CAST
            $child = (string)$child;

        }

    }

    // RETURN CLEAN OBJECT
    return $xmlObject;

} // END FUNCTION
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top