使用PHP(simplexml)根据XML中的内容排除子项

时间:2011-01-09 04:47:09

标签: php xml simplexml

关于PHP和XML的另一个问题......

根据儿童的内容排除儿童是否可行。

请参阅以下示例: 如果“title”包含单词“XTRA:”,我不希望列出这部“电影”。

这是我的PHP代码:

<? $xml = simplexml_load_file("movies.xml");
foreach ($xml->movie as $movie){ ?>

<h2><? echo $movie->title ?></h2>
<p>Year: <? echo $movie->year ?></p>

<? } ?>

这是mys XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<movies>
    <movie>
        <title>Little Fockers</title>
    <year>2010</year>
</movie>
<movie>
    <title>Little Fockers XTRA: teaser 3</title>
    <year>2010</year>
</movie>
</movies>

上述代码的结果是:

<h2>Little Fockers</h2>
<p>Year: 2010</p>

<h2>Little Fockers XTRA: teaser 3</h2>
<p>Year: 2010</p>

我希望它只是:

<h2>Little Fockers</h2>
<p>Year: 2010</p>

1 个答案:

答案 0 :(得分:1)

有两种方法可以过滤节点。第一个是XPath 1.0(libxml / SimpleXML支持的版本)

$movies = simplexml_load_file("movies.xml");

foreach ($movies->xpath('movie[not(contains(title, "XTRA:"))]') as $movie)
{
    echo '<h2>', $movie->title, '</h2>';
}

在这里,我们使用contains function,即XPath等效于PHP's strpos()。不幸的是,XPath 1.0只有一些字符串函数,所有这些函数都区分大小写。因此,虽然XPath非常适合处理复杂的层次结构,但它在处理字符串时却不太好。在这种情况下,您可以回退到PHP解决方案,例如:

$movies = simplexml_load_file("movies.xml");

foreach ($movies->movie as $movie)
{
    if (stripos($movie->title, 'XTRA:') !== false)
    {
        // skip to next iteration
        continue;
    }

    echo '<h2>', $movie->title, '</h2>';
}