为了账号安全,请及时绑定邮箱和手机立即绑定

php xml XPath foreach 返回所有节点而不是迭代

php xml XPath foreach 返回所有节点而不是迭代

PHP
UYOU 2023-04-28 16:19:07
我有一个这样的 XML 文件<Articles> <Article>  <ArticleTitle>    First Book </ArticleTitle></Article> <Article>  <ArticleTitle>    Second Book </ArticleTitle></Article>并使用这种类型的 php 脚本以迭代方式检索 ArticleTitle 的内容foreach ($xml->Article as $Article){$title = $Article->xpath('//ArticleTitle');echo $title[0];}但这显示First BookFirst Book代替First BookSecond Book我假设在foreach ($xml->Article as $Article)启动时它将获取每个 Article 节点,然后我可以访问该节点的内容,但这不是正在发生的事情。我究竟做错了什么?
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

您的问题是您使用的 xpath 是绝对路径(以 开头/),因此您从子节点调用它这一事实没有任何效果。您应该使用相对路径,在这种情况下,要么简单地ArticleTitle就足够了,要么.//ArticleTitle允许Article和之间的其他节点ArticleTitle。例如:


foreach ($xml->Article as $Article){

    $title = $Article->xpath('ArticleTitle');

    echo $title[0];

}


foreach ($xml->Article as $Article){

    $title = $Article->xpath('.//ArticleTitle');

    echo $title[0];

}

两种情况下的输出都是:


First Book

Second Book

查看完整回答
反对 回复 2023-04-28
?
浮云间

TA贡献1829条经验 获得超4个赞

这也适用于您原来的 XPath 表达式:


$xml = <<<'XML'

<Articles>

<Article>

<ArticleTitle>First Book</ArticleTitle>

</Article>

<Article>

<ArticleTitle>Second Book</ArticleTitle>

</Article>

</Articles>

XML;

$document = new DOMDocument();

$document->loadXML($xml);

$xpath = new DOMXpath($document);

$elements = $xpath->query('//ArticleTitle');

foreach($elements as $element)

echo ($element->nodeValue), "\n";

?>

输出 :


First Book

Second Book


查看完整回答
反对 回复 2023-04-28
  • 2 回答
  • 0 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信