【发布时间】:2020-06-16 12:11:43
【问题描述】:
我正在使用DOMDocument 在 PHP 中加载 RSS XML 提要。这很好用。我需要解析我的 XML,找到特定的值,然后只再次显示某些节点。
XML 看起来像这样...
<rss version="2.0">
<channel>
<title>Title</title>
<link></link>
<item>
<title>Title #1</title>
<description>Here I want to filter</description>
</item>
<item>
<title>Title #2</title>
<description>Should not be displayed</description>
</item>
</channel>
我想在描述标签内进行搜索,如果找到了关键字,我想显示item。如果没有找到,我想删除父item。
这就是我到目前为止所尝试的......
<?php
header('Content-Type: text/xml');
// Load our XML document
$rss = new DOMDocument();
$rss->load('https://myurl');
$description = $rss->getElementsByTagName('description');
foreach ($description as $node) {
$s = $node->nodeValue;
if (strpos($s, 'filter') !== false)
{
//found the keyword, nothing to delete
}
else
{
//didnt find it, now delete item
$node->parentNode->parentNode->removeChild($node->parentNode);
}
}
echo $description->saveXml();
我正在尝试获取所有描述节点,检查它们是否包含字符串,如果不包含,则删除父节点。搜索字符串有效,但不能删除节点。如果我回显我的 XML,则没有任何改变。
【问题讨论】:
-
在您的示例 XML 中,这两个项目都包含
filter,因此两者都不会被删除。 -
@NigelRen 没错。我只是改变了它来证明这个问题。在我的示例中,即使只有某些节点拥有它,它仍然无法正常工作。
-
最后你应该使用
echo $rss->saveXml();。 -
@NigelRen 试过了,但仍然显示 XML。我认为 getElementsByTagName 是错误的。它返回一个 int,而不是节点。 For 循环只运行一次
-
使用您的测试 XML(尽管已更正以添加结束 rss 标记),它会按照我的预期执行并仅显示第一项,删除
Should not be displayed项。