web-dev-qa-db-fra.com

SimpleXml en chaîne

Existe-t-il une fonction qui crée une chaîne à partir de PHP SimpleXMLElement?

75
liysd

Vous pouvez utiliser la méthode SimpleXMLElement::asXML() pour accomplir ceci:

$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();
110
Tim Cooper

Vous pouvez utiliser le casting:

<?php

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

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

Le texte $ sera 'Hello World'

56
Nicolay77

En réalité, asXML () convertit la chaîne en xml comme son nom l'indique:

<id>5</id>

Cela s'affichera normalement sur une page Web, mais cela posera des problèmes si vous faites correspondre des valeurs avec autre chose.

Vous pouvez utiliser la fonction strip_tags pour obtenir une valeur réelle du champ comme:

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

PS: si vous travaillez avec des nombres entiers ou flottants, vous devez le convertir en entier avec intval () ou floatval () .

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

Vous pouvez utiliser la méthode asXML comme:

<?php

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

// make any changes.
....

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

Vous pouvez utiliser ->child pour obtenir un élément enfant nommé child .

Cet élément contiendra le texte de l’élément child .

Mais si vous essayez var_dump() avec cette variable, vous verrez que ce n'est pas en réalité une chaîne PHP.

La solution la plus simple consiste à exécuter une strval(xml->child); Elle sera convertie en une chaîne réelle PHP.

Ceci est utile lors du débogage lors de la mise en boucle de votre XML et de l'utilisation de var_dump() pour vérifier le résultat.

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

8
Leander

Voici une fonction que j'ai écrite pour résoudre ce problème (en supposant que la balise n'a pas d'attribut). Cette fonction gardera le formatage HTML dans le noeud:

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
4
paralaks

Parfois, vous pouvez simplement dactylographier:

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

$s = (string) $xml; // returns "en";
0
Luca Reghellin

Ceci est un ancien post, mais mes découvertes pourraient aider quelqu'un. 

Probablement en fonction du flux XML, il se peut que vous n’ayez pas besoin d’utiliser __toString (); J'ai dû utiliser __toString (), sinon la chaîne est renvoyée dans un SimpleXMLElement. Peut-être dois-je approfondir l'objet plus loin ...

0
Keenan Stewart