PHP 解析 XML 以获取多个深度的所有字符串值

PHP Parsing XML to Get All String Values At Multiple Depths

提问人:Maciek 提问时间:8/15/2023 更新时间:8/15/2023 访问量:47

问:

我有一个类似于以下示例的 XML:

<article>
  <body>
    <title>I <underline><bold>LOVE</bold></underline> Coding</title>
  </body>
</article>

我想获取节点标题的全文。

$xml=simplexml_load_file("file.xml");
$title=$xml->xpath('//title')??[];
echo (string)$title;

我似乎无法更深入地抓住带下划线/粗体的 XML 部分。

我希望结果是一个字符串。I LOVE Coding

我怎样才能做到这一点?我只是得到.I Coding

我也试过了,但得到的结果是空的。xpath('string(//title)')

php xpath 简单xml

评论


答:

1赞 Dirk J. Faber 8/15/2023 #1

您需要像这样剥离内部的标签:<title>

$xmlFile = simplexml_load_file('file.xml');
$title = strip_tags($xmlFile->body->title->asXML());

echo $title;

或者,如果你的 XML 不是文件,而是字符串:

$xmlString = '<article>
  <body>
    <title>I <underline><bold>LOVE</bold></underline> Coding</title>
  </body>
</article>';

$xml = simplexml_load_string($xmlString);
$title = strip_tags($xml->body->title->asXML());

echo $title;

评论

0赞 Dirk J. Faber 8/15/2023
有关交互式示例,请参见:3v4l.org/SYgPm
1赞 Olivier 8/15/2023 #2

你可以调用 dom_import_simplexml() 来 检索 DOM 元素,然后使用 textContent 属性:

$xml = <<<XML
<article>
  <body>
    <title>I <underline><bold>LOVE</bold></underline> Coding</title>
  </body>
</article>
XML;

$doc = simplexml_load_string($xml);
$title = $doc->xpath('//title')[0];
$dom = dom_import_simplexml($title);
echo $dom->textContent;

结果:

I LOVE Coding
3赞 Sammitch 8/15/2023 #3

坦率地说,SimpleXML不是一个好的接口。这很简单,因为它没有太多内容,但也很简单,因为有相当多的缺失,而且经常最终需要更多的工作。

DomDocument 功能更全面,而且与 IMO 合作得更好。

$xml = <<<_E_
<article>
  <body>
    <title>I <underline><bold>LOVE</bold></underline> Coding</title>
  </body>
</article>
_E_;

$d = new DomDocument();
$d->loadXml($xml);
$x = new DomXPath($d);
$r = $x->query('//title');

var_dump($r[0]->textContent);

输出:

string(13) "I LOVE Coding"

评论

0赞 IMSoP 8/16/2023
我认为更多的情况是,SimpleXML 针对处理树状 XML 进行了优化,而 DOM 针对处理类似标记的 XML(和 HTML)进行了优化。例如,在 SimpleXML 中定位特定元素就像 一样简单,在 DOM 中,这需要多次调用 ,或者使用 XPath(带有单独的对象)。别忘了你可以自由地混合它们 - 基本上没有调用和的惩罚,因为它们都在内部包装了相同的表示。$xml->body->title->underline->bold;getElementsByNameDomXPathdom_import_simplexmlsimplexml_import_dom