【问题标题】:How can I extract all text from XML data using PHP (i.e. SimpleXmlElement)?如何使用 PHP(即 SimpleXmlElement)从 XML 数据中提取所有文本?
【发布时间】:2015-08-01 20:54:34
【问题描述】:

这是我的 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 展平并从中提取所有文本,而不考虑标签?

【问题讨论】:

  • 您是否考虑过使用正则表达式从原始字符串中删除所有标签?

标签: php xml


【解决方案1】:

这可以在 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);

【讨论】:

    【解决方案2】:

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

    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 标记,但这样会好很多。

    【讨论】:

      猜你喜欢
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      相关资源
      最近更新 更多