SimpleXml thành chuỗi


Câu trả lời:


120

Bạn có thể sử dụng SimpleXMLElement::asXML()phương pháp để thực hiện điều này:

$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
nhưng bạn còn lại với các thẻ, nếu bạn không muốn các thẻ thì sao? các câu trả lời khác giải quyết vấn đề này
Andrew

63

Bạn có thể sử dụng truyền:

<?php

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

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

$ text sẽ là 'Hello World'


2
Công trình đối với tôi bởi vì nó không đưa thẻ trong, nhờ
Andrew

16

Trên thực tế asXML () chuyển đổi chuỗi thành xml như tên của nó:

<id>5</id>

Điều này sẽ hiển thị bình thường trên một trang web nhưng nó sẽ gây ra sự cố khi bạn khớp các giá trị với một thứ khác.

Bạn có thể sử dụng hàm strip_tags để nhận giá trị thực của trường như:

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

Tái bút: nếu bạn đang làm việc với số nguyên hoặc số thực, bạn cần chuyển nó thành số nguyên với intval () hoặc floatval () .

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

15

Bạn có thể sử dụng asXMLphương pháp như sau:

<?php

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

// make any changes.
....

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

9

Bạn có thể sử dụng ->childđể lấy một phần tử con có tên là child .

Phần tử này sẽ chứa văn bản của phần tử con .

Nhưng nếu bạn thử var_dump()trên biến đó, bạn sẽ thấy nó không thực sự là một chuỗi PHP.

Cách dễ nhất để giải quyết vấn đề này là thực hiện strval(xml->child); Điều đó sẽ chuyển đổi nó thành một chuỗi PHP thực tế.

Điều này hữu ích khi gỡ lỗi khi lặp lại XML của bạn và sử dụng var_dump()để kiểm tra kết quả.

Vì vậy $s = strval($xml->child);.


4

Đây là một hàm tôi đã viết để giải quyết vấn đề này (giả sử thẻ không có thuộc tính). Hàm này sẽ giữ định dạng HTML trong nút:

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

Đôi khi bạn có thể gõ đơn giản:

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

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

2
Đây là loại đối tượng bạn nhận được cho trường mô tả của nguồn cấp RSS. Thật phản trực giác khi nó hoạt động, nhưng đó là giải pháp duy nhất ở đây cho tôi chuỗi bên trong $xmlitem->description. Cảm ơn.
Henrik Erlandsson

0

Có thể tùy thuộc vào nguồn cấp dữ liệu XML mà bạn có thể / có thể không cần sử dụng __toString(); Tôi đã phải sử dụng __toString()nếu không, nó đang trả về chuỗi bên trong một SimpleXMLElement. Có lẽ tôi cần phải đi sâu vào đối tượng hơn nữa ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.