Работа со смешанным списком дочерних узлов и PHP foreach - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть XML-файл, который выглядит так:

<rss>
    <channel>
        <title>title</title>
        <link>link</link>
        <description>description</description>
        <item>
            <title>title 1</title>
            <sort>1</sort>
        </item>
        <label>
            <title>LABEL 1</title>
            <sort>2</sort>            
        </label>
        <item>
            <title>title 2</title>
            <sort>3</sort>
        </item>
        <label>
            <title>LABEL 2</title>
            <sort>4</sort>            
        </label>
        <item>
            <title>title 3</title>
            <sort>5</sort>
        </item>
        <template>3</template>
    </channel>
</rss>

Я использую SimpleXML, и мне нужно сделать foreach в комбинированном списке узлов 'item' и 'label', игнорируя остальные дочерние элементы 'channel'.

Я использовал:

foreach($feed->channel->item as $item) { }

... и ярлыки были добавлены как:

<item type="label">
    <title>LABEL 1</title>
</item>

... но получатель файла, который я создаю, ожидает узел для меток.


UPDATE!

Поскольку вопрос не был опубликован (нужен заголовок!), И я сам нашел ответ, а вот что я сделал:

/* Search for items and labels */
$result = $iFeed->xpath('channel/*[name()="item" or name()="label"]');

foreach($result as $item) {
   // boom
}

1 Ответ

2 голосов
/ 27 апреля 2011

Я думаю, вы также можете использовать оператор |. Это объединяет результаты нескольких запросов XPath.

$result = $root->xpath('channel/item|channel/label');

Похоже, он также сохраняет порядок узлов, поэтому узлы возвращаются в следующем порядке: «элемент, метка, элемент, метка, элемент» (в отличие от «элемент, элемент, элемент, метка, метка» ).

...