如何从XML解析中排除某些记录?

时间:2014-04-03 13:50:12

标签: php xml arrays foreach array-difference

我使用以下代码从XML文件中提取数据:

<?php
$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$items = array();
$exclude = array('4419','4373');
$items = array_diff($items, $exclude);

foreach($xml as $Reader) { 
    $items[] = $Reader; 
}
usort ($items, function($a, $b) { 
    return strcmp($a->Status,$b->Status); 
});

foreach($items as $Reader) { 
    if($Reader->Status != 'Logged Off' && $Reader->Picture != 'None')
        {
        include '/extras/reader-single.php';
        }
}

?>

两行显示$ exclude和$ items我已经添加了关于从XML中排除的另一篇帖子excluding values from a foreach loop,但是当我加载页面时......指定了PIN的两条记录仍在显示

这是排除从XML文件中提取某些记录的正确方法吗?

非常感谢任何帮助!

编辑:输入的四位数字是在Reader-&gt; PIN处找到的PIN码 想一想,它是不是在xml文件上的数字和Reader-&gt; PIN之间建立了链接?

3 个答案:

答案 0 :(得分:1)

有一种更简单的方法可以专门查询属性 - 或排除它们。

$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$matches = $xml->xpath( "//Reader[Pin!=4419 and Pin!=4373]" );

这将为您提供整个结构,减去两个项目#4419和#4373。

答案 1 :(得分:0)

正如我在评论中所说,获取每条记录的引脚,将其与排除数组进行比较,如果它是排除数组的一部分,则继续循环。像这样:

$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$items = array();
$exclude = array('4419','4373');
$items = array_diff($items, $exclude);

foreach($xml as $Reader) { 
    $items[] = $Reader; 
}

usort ($items, function($a, $b) { 
    return strcmp($a->Status,$b->Status); 
});

foreach($xml as $Reader) { 
    if($Reader->Status != 'Logged Off'
        && $Reader->Picture != 'None'
        // check if the Pin is in exclude array
        && !in_array($Reader->Pin, $exclude)
    ) { 
        include '/extras/reader-single.php';
    }   
}

或者您可以使用array_filter()

$url = 'http://www.inveroak.com/readerimages/livepanel/91221.xml';
$xml = simplexml_load_file($url);
$items = array();
$exclude = array('4419','4373');
$items = array_diff($items, $exclude);

foreach($xml as $Reader) { 
    $items[] = $Reader; 
}

$items= array_filter($items, function($Reader) use ($exclude) {
    if($Reader->Status == 'Logged Off'
       || $Reader->Picture == 'None'
       || in_array($Reader->Pin, $exclude)
    ) { 
        return false;
    }   
    return true;
});

usort ($items, function($a, $b) {
    return strcmp($a->Status,$b->Status);
});

foreach($items as $Reader) {
    include '/extras/reader-single.php'; 
}

答案 2 :(得分:0)

另一种方法是在第一个foreach循环中过滤掉它们:

foreach($xml as $Reader) {
    if (array_search($Reader->Pin, $exclude) === FALSE) {
         $items[] = $Reader;
    }
}

在任何一种情况下,您都不需要:

$items = array_diff($items, $exclude);

array_diff()返回第一个数组($ items)中第二个数组中不存在的值($ exclude)。因为在你的情况下第一个数组是一个空数组,它没有值,所以array_diff()也总是返回一个空数组。

也许有人会提出XPath解决方案 - 这将是另一种方法。 (编辑 - 啊,我看到@ pp19dd提供了这个。)