Forçando um objeto SimpleXML para uma cadeia, independentemente do contexto
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 ??p>
$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?
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