SimpleXml na ciąg


Odpowiedzi:


120

Możesz użyć tej SimpleXMLElement::asXML()metody, aby to osiągnąć:

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

19
$string = $xml->child->__toString();
Luke Snowden

htmlspecialchars ($ xml-> asXML ())?
zloctb

1
ale ty masz tagi, a co jeśli nie chcesz tagów? inne odpowiedzi rozwiązują ten problem
Andrew

63

Możesz użyć przesyłania:

<?php

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

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

$ text zmieni się na „Hello World”


2
U mnie działa, ponieważ nie umieszcza tagów, dzięki
Andrew

16

Właściwie asXML () konwertuje ciąg znaków na xml zgodnie z jego nazwą:

<id>5</id>

Będzie to wyświetlane normalnie na stronie internetowej, ale spowoduje problemy podczas dopasowywania wartości z czymś innym.

Możesz użyć funkcji strip_tags, aby uzyskać rzeczywistą wartość pola, taką jak:

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

PS: jeśli pracujesz z liczbami całkowitymi lub liczbami zmiennoprzecinkowymi, musisz przekonwertować je na liczby całkowite za pomocą intval () lub floatval () .

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

15

Możesz użyć tej asXMLmetody jako:

<?php

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

// make any changes.
....

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

9

Możesz użyć, ->childaby pobrać element podrzędny o nazwie child .

Ten element będzie zawierał tekst elementu podrzędnego .

Ale jeśli spróbujesz var_dump()tej zmiennej, zobaczysz, że w rzeczywistości nie jest to ciąg PHP.

Najłatwiejszym sposobem obejścia tego jest wykonanie polecenia strval(xml->child); That przekonwertuje go na rzeczywisty ciąg PHP.

Jest to przydatne podczas debugowania podczas zapętlania kodu XML i używania var_dump()do sprawdzania wyniku.

A więc $s = strval($xml->child);.


4

Oto funkcja, którą napisałem, aby rozwiązać ten problem (zakładając, że tag nie ma atrybutów). Ta funkcja zachowa formatowanie HTML w węźle:

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

1

Czasami możesz po prostu napisać:

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

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

2
To jest rodzaj obiektu, który otrzymujesz w polu opisu źródła RSS. To sprzeczne z intuicją, ale to było jedyne rozwiązanie, które dało mi sznurek w środku $xmlitem->description. Dzięki.
Henrik Erlandsson

0

Prawdopodobnie w zależności od źródła XML, którego możesz / nie musisz używać __toString(); Musiałem użyć, w __toString()przeciwnym razie zwraca ciąg wewnątrz elementu SimpleXMLElement. Może potrzebuję dokładniej przeanalizować obiekt ...

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.