SimpleXml a cadena

79

¿Hay alguna función que haga cadenas desde PHP SimpleXMLElement?

liysd
fuente
4
¿Qué tipo de cuerda quieres?
Shamim Hafiz

Respuestas:

120

Puede usar el SimpleXMLElement::asXML()método para lograr esto:

$string = "<element><child>Hello World</child></element>";
$xml = new SimpleXMLElement($string);

// The entire XML tree as a string:
// "<element><child>Hello World</child></element>"
$xml->asXML();

// Just the child node as a string:
// "<child>Hello World</child>"
$xml->child->asXML();
Tim Cooper
fuente
19
$string = $xml->child->__toString();
Luke Snowden
htmlspecialchars ($ xml-> asXML ())?
zloctb
1
pero te quedan las etiquetas, ¿qué pasa si no quieres las etiquetas? otras respuestas resuelven este problema
Andrew
63

Puedes usar el casting:

<?php

$string = "<element><child>Hello World</child></element>";
$xml = new SimpleXMLElement($string);

$text = (string)$xml->child;

$ text será 'Hola mundo'

Nicolay77
fuente
2
Funciona para mí porque no pone las etiquetas, gracias
Andrew
16

En realidad, asXML () convierte la cadena en xml como su nombre dice:

<id>5</id>

Esto se mostrará normalmente en una página web, pero causará problemas cuando haga coincidir valores con otra cosa.

Puede usar la función strip_tags para obtener un valor real del campo como:

$newString = strip_tags($xml->asXML());

PD: si está trabajando con números enteros o flotantes, debe convertirlo en entero con intval () o floatval () .

$newNumber = intval(strip_tags($xml->asXML()));
tolginho
fuente
15

Puede utilizar el asXMLmétodo como:

<?php

// string to SimpleXMLElement
$xml = new SimpleXMLElement($string);

// make any changes.
....

// convert the SimpleXMLElement back to string.
$newString = $xml->asXML();
?>
codaddict
fuente
9

Puede usar ->childpara obtener un elemento secundario llamado child .

Este elemento contendrá el texto del elemento hijo .

Pero si prueba var_dump()esa variable, verá que en realidad no es una cadena PHP.

La forma más fácil de evitar esto es realizar un strval(xml->child); Eso lo convertirá en una cadena PHP real.

Esto es útil cuando se depura cuando se hace un bucle en su XML y se usa var_dump()para verificar el resultado.

Entonces $s = strval($xml->child);.

Leander
fuente
4

Aquí hay una función que escribí para resolver este problema (asumiendo que la etiqueta no tiene atributos). Esta función mantendrá el formato HTML en el nodo:

function getAsXMLContent($xmlElement)
{
  $content=$xmlElement->asXML();

  $end=strpos($content,'>');
  if ($end!==false)
  {
    $tag=substr($content, 1, $end-1);

    return str_replace(array('<'.$tag.'>', '</'.$tag.'>'), '', $content);
  }
  else
    return '';
}


$string = "<element><child>Hello World</child></element>";
$xml = new SimpleXMLElement($string);

echo getAsXMLContent($xml->child); // prints Hello World
paralaks
fuente
1

A veces puedes simplemente encasillar:

// this is the value of my $xml
object(SimpleXMLElement)#10227 (1) {
  [0]=>
  string(2) "en"
}

$s = (string) $xml; // returns "en";
Luca Reghellin
fuente
2
Este es el tipo de objeto que obtiene para el campo de descripción de una fuente RSS. Es contrario a la intuición que funcione, pero fue la única solución aquí que me dio la cuerda adentro $xmlitem->description. Gracias.
Henrik Erlandsson
0

Probablemente, dependiendo de la fuente XML que pueda o no necesite utilizar __toString(); Tuve que usar el, de lo __toString()contrario, está devolviendo la cadena dentro de un SimpleXMLElement. Quizás necesito profundizar más en el objeto ...

Keenan Stewart
fuente