处理子节点和PHP foreach的混合列表

时间:2011-04-27 16:48:52

标签: php xml simplexml

我有一个如下所示的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,我需要在'item'和'label'节点的组合列表上做一个foreach,忽略其余的'channel'子节点。

我正在使用:

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

...并将标签添加为:

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

...但我正在构建的文件的使用者期望标签的节点。

<小时/>

更新<!/强>

由于这个问题没有发布(需要一个标题!)而且我在此期间找到了自己的答案,这就是我所做的:

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

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

1 个答案:

答案 0 :(得分:2)

我认为您也可以使用|运算符。这结合了多个XPath查询的结果。

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

看起来它也保留了节点的顺序,因此节点按以下顺序返回:“item,label,item,label,item”(与“item,item,item,label,label”相对) )。