【问题标题】:How can I exclude certain records from an XML parse?如何从 XML 解析中排除某些记录?
【发布时间】:2014-05-15 09:51:45
【问题描述】:

我正在使用以下代码从 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->PIN 中找到的 PIN 码 想了想,是不是没有把数字和xml文件上的Reader->PIN做链接?

【问题讨论】:

  • 通常你会调用一个函数而不是在一个循环中多次使用include
  • 包含的文件,基本上是每个人要显示的骨架布局。使用函数将如何允许我创建 HTML 布局?此外,它可以正常工作。它会提取该 XML 文件中的所有记录,我只需要通过在列表中输入 PIN 来排除一些记录
  • 获取每条记录的引脚,将其与排除数组进行比较,如果它是排除数组的一部分,则只需 continue 循环
  • 抱歉听起来含糊不清,但我该怎么做呢?感谢您的帮助,但我对功能非常缺乏经验!

标签: php xml arrays foreach array-difference


【解决方案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。

【讨论】:

  • 看起来比我事后过滤掉它们要好。
  • 通过 $matches 你的意思是这一行替换 $items = array(); ?这似乎在我上传后不起作用,到目前为止没有任何效果......而且我确定一切看起来都很好
  • 差不多。如果你执行echo "&lt;PRE&gt;"; print_r( $matches);,你会看到一个 SimpleXMLElement 对象数组,每个对象都有 name/descr/status/etc 属性。
【解决方案2】:

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

$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'; 
}

【讨论】:

  • 它似乎仍然将所有读者从 XML 中拉出来。有什么我可以提供的可以帮助你的吗?
  • 我已经测试过了。也许您犯了复制和粘贴错误。但是,请检查@pp19dd 的答案。我会用他的答案。
  • 我编辑了错误的文件。好吧,这是正确的文件,但它是旧版本。但这确实有效
【解决方案3】:

另一种方法是在第一个 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 提供了这个。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多