Вот мои данные 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> "
Однако вам придется вырезать открывающий тег XML, но это намного лучше.