SimpleXml в строку

79

Есть ли какая-нибудь функция, которая делает строку из PHP SimpleXMLElement?

liysd
источник
4
Какая струна тебе нужна?
Шамим Хафиз

Ответы:

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();
Люк Сноуден
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"

Николай77
источник
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();
?>
codaddict
источник
9

Вы можете использовать ->childдля получения дочернего элемента с именем child .

Этот элемент будет содержать текст дочернего элемента.

Но если вы попробуете var_dump()эту переменную, вы увидите, что на самом деле это не строка PHP.

Самый простой способ обойти это - выполнить, strval(xml->child); который преобразует его в реальную строку PHP.

Это полезно при отладке при зацикливании XML и использовании var_dump()для проверки результата.

Итак $s = strval($xml->child);.

Leander
источник
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. Может, мне нужно глубже изучить объект ...

Кинан Стюарт
источник