PHP RSS XML解析、过滤并再次显示

PHP RSS XML解析、过滤并再次显示,php,xml,rss,Php,Xml,Rss,我正在用PHP加载带有DOMDocument的RSS XML提要。那很好。我需要解析我的XML,找到特定的值,然后再次只显示某些节点 XML看起来像 <rss version="2.0"> <channel> <title>Title</title> <link></link> <item> <title>Title #1</title> <descr

我正在用PHP加载带有
DOMDocument
的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>
我正在尝试获取所有描述节点,检查它们是否包含字符串,如果不包含,则删除父节点。搜索字符串有效,但删除节点无效。如果我回显XML,则没有任何更改。

getElementsByTagName()将返回“实时”结果。如果您修改文档,它将更改。您可以使用
iterator\u to\u array()
创建一个稳定的副本

另一个选项是使用Xpath表达式获取特定节点

$document = new DOMDocument();
$document->loadXML($xmlString);
$xpath = new DOMXpath($document);

// fetch items that contain "filter" in their description
$items = $xpath->evaluate('/rss/channel/item[contains(description, "filter")]');
foreach ($items as $item) {
    // dump the title child element text content
    var_dump($xpath->evaluate('string(title)', $item));
} 

// fetch items that do not contain "filter" in their description
$items = $xpath->evaluate('/rss/channel/item[not(contains(description, "filter"))]');
foreach ($items as $item) {
    // remove item element
    $item->parentNode->removeChild($item);
} 
echo $document->saveXML();
输出:

string(8) "Title #1"
<?xml version="1.0"?>
<rss version="2.0">
  <channel>
  <title>Title</title>
  <link/>
  <item>
    <title>Title #1</title>
    <description>Here I want to filter</description>
  </item>

</channel>
</rss>
string(8)“Title#1”
标题
标题#1
这里我要过滤

在您的示例XML中,两个项目都包含
过滤器
,因此都不会被删除。@NigelRen这是正确的。我只是换了个说法来证明这个问题。在我的示例中,即使只有某些节点拥有它,它仍然不起作用@NigelRen尝试过,但仍然显示XML。我认为getElementsByTagName是错误的。它返回一个int,而不是节点。For循环只在测试XML中运行一次(尽管已更正为添加结束rss标记),它按照我的预期运行,只显示第一项,删除
不应显示
项。非常感谢!XPath工作得非常好。我删除了var_dump,因为XML在显示它时出现了问题。当然,这是两个示例-一个是如何显示来自特定节点的数据,另一个是如何删除特定节点。明白了!非常感谢你的帮助!!感激
string(8) "Title #1"
<?xml version="1.0"?>
<rss version="2.0">
  <channel>
  <title>Title</title>
  <link/>
  <item>
    <title>Title #1</title>
    <description>Here I want to filter</description>
  </item>

</channel>
</rss>