Исключить детей на основе содержимого в XML с PHP (simplexml) - PullRequest
0 голосов
/ 09 января 2011

Еще один вопрос по поводу 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 Ответ

1 голос
/ 09 января 2011

Существует два способа фильтрации узлов. Первый - с 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>';
}

Здесь мы используем содержит функцию , которая эквивалентна XPath strpos PHP () . К сожалению, 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>';
}
...