Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP(即SimpleXmlElement)从XML数据中提取所有文本?_Php_Xml - Fatal编程技术网

如何使用PHP(即SimpleXmlElement)从XML数据中提取所有文本?

如何使用PHP(即SimpleXmlElement)从XML数据中提取所有文本?,php,xml,Php,Xml,以下是我的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数据:

$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>'; 
这将返回:

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展平并从中提取所有文本,而不考虑标记

SimpleXMLElement上的
\uuuu toString
文档说:“返回直接在此元素中的文本内容。不返回此元素子元素中的文本内容。”

asXML
方法似乎更适合您的需求:

它将返回一个字符串:

”
1908年7月14日至16日,伦敦福巴厅,第五届国际福巴会议报告。
“


不过,您必须去掉开头的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)'));
甚至可以将
simplexmlement
转换为DOM元素节点

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

您是否考虑过使用正则表达式从原始字符串中删除所有标记?
$element = new SimpleXMLElement($data);
$node = dom_import_simplexml($element);
var_dump($node->textContent);