PHP RSS XML解析、过滤并再次显示
我正在用PHP加载带有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
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>