SimpleXml до рядка


Відповіді:


120

Ви можете використати SimpleXMLElement::asXML()метод для досягнення цього:

$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
але у вас залишилися теги, а що, якщо ви не хочете теги? інші відповіді вирішують цю проблему
Ендрю

63

Ви можете використовувати кастинг:

<?php

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

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

$ text буде "Hello World"


2
Працює для мене, тому що не поміщає теги, дякую
Ендрю

16

Насправді asXML () перетворює рядок у xml, як сказано в назві:

<id>5</id>

Це зазвичай відображається на веб-сторінці, але це спричинить проблеми, коли ви співпадаєте значення з чимось іншим.

Ви можете використовувати функцію strip_tags, щоб отримати реальне значення поля, наприклад:

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

PS: якщо ви працюєте з цілими чи плаваючими числами, вам потрібно перетворити його на ціле з intval () або floatval () .

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

15

Ви можете використовувати asXMLметод як:

<?php

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

// make any changes.
....

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

9

Ви можете використовувати, ->childщоб отримати дочірній елемент з іменем дочірній .

Цей елемент міститиме текст дочірнього елемента.

Але якщо ви спробуєте var_dump()цю змінну, то побачите, що насправді це не рядок PHP.

Найпростіший спосіб це зробити - виконати strval(xml->child); те, що перетворить його на фактичний рядок PHP.

Це корисно при налагодженні під час циклу XML і var_dump()для перевірки результату.

Отже $s = strval($xml->child);.


4

Ось функція, яку я написав для вирішення цієї проблеми (припускаючи, що тег не має атрибутів). Ця функція збереже форматування HTML у вузлі:

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

Іноді ви можете просто набрати текст:

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

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

2
Це такий об’єкт, який ви отримуєте для поля опису стрічки RSS. Це інтуїтивно зрозуміло, що це працює, але це єдине рішення тут, яке дало мені рядок всередині $xmlitem->description. Дякую.
Генрік Ерландссон

0

Можливо, залежно від стрічки XML, яку вам може / може не знадобитися використовувати __toString(); Мені довелося використовувати, __toString()інакше він повертає рядок усередині SimpleXMLElement. Можливо, мені потрібно детальніше розібрати об'єкт ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.