Как извлечь весь текст из XML-данных с помощью PHP (например, SimpleXmlElement)?

Вот мои данные XML:

$data = '<title>Report of the <org reg="International Foo and Bar Conference, 5th">Fifth International Foo and Bar Conference</org>, <org>Foobar Hall</org>, London, July 14 to 16, 1908.</title>'; 

Я могу загрузить его:

 $xml = simplexml_load_string( $data ); print_r( $xml ); 

Это возвращает:

 SimpleXMLElement Object ( [org] => Array ( [0] => Fifth International Foo and Bar Conference [1] => Foobar Hall ) ) 

Но теперь я могу попытаться снова получить его в строке:

 $flat = (string) $xml; print_r( $flat ); 

И это то, что я вижу:

 Report of the , , London, July 14 to 16, 1908. 

Но я предпочел бы, чтобы это было так:

 Report of the Fifth International Foo and Bar Conference, Foobar Hall, London, July 14 to 16, 1908. 

Есть ли простой способ сделать это с PHP, без явного возврата через каждый узел? То есть есть ли способ просто сгладить XML и извлечь из него весь текст, независимо от тегов?

Это можно легко сделать в DOM. Узлы элементов DOM имеют свойство $ textContent, которое возвращает его текстовое содержимое, включая все текстовые узлы-потомки.

 $document = new DOMDocument(); $document->loadXml($data); var_dump($document->documentElement->textContent); 

Вывод:

 string(99) "Report of the Fifth International Foo and Bar Conference, Foobar Hall, London, July 14 to 16, 1908." 

Если у вас нет узла элемента уже в переменной, будет удобнее использовать XPath.

 $document = new DOMDocument(); $document->loadXml($data); $xpath = new DOMXpath($document); var_dump($xpath->evaluate('string(/title)')); 

Можно даже преобразовать SimpleXMLElement в узел элемента DOM.

 $element = new SimpleXMLElement($data); $node = dom_import_simplexml($element); var_dump($node->textContent); 

в документах для __toString на SimpleXMLElement говорится: «Возвращает текстовый контент, который находится непосредственно в этом элементе. Не возвращает текстовое содержимое, находящееся внутри дочерних элементов этого элемента».

Метод asXML кажется лучше для того, что вы хотите: http://php.net/manual/en/simplexmlelement.asxml.php

он вернет строку:

"<?xml version="1.0"?> <title>Report of the <org reg="International Foo and Bar Conference, 5th">Fifth International Foo and Bar Conference</org>, <org>Foobar Hall</org>, London, July 14 to 16, 1908.</title> "

https://eval.in/410230

Однако вам придется вырезать открывающий тег XML, но это намного лучше.