我有一个简单的XML解析器,我想顺序运行目录中的所有文件,我的问题是如何遍历所有xml文件并一个接一个地运行脚本。而不是手动这样做。
$string = file_get_contents('epgs/file1.xml'); // loop through all files
$xml = new SimpleXMLElement($string);
$events=$xml->xpath("/DVB-EPG/Service/Event");
if ($events) {
foreach ($events as $event) {
$id = $event["id"];
$start_date = $event["start"] ;
$name = $event->ShortEventDescriptor->EventName ;
$text = $event->ShortEventDescriptor->Text;
$values = array (
':event_id'=>$id,
':event_name'=>$name,
':event_desc'=>$text,
':start_date'=>$start_date
);
$stmt = $dbh->prepare ($sql);
$stmt->execute($values);
}
}
目录epgs有多个文件:file1.xml,file2.xml,file3.xml等。
ANSWER
$files = glob("epgs/*.xml");
foreach ($files as $file) {
//script...
}
答案 0 :(得分:1)
虽然您的问题已在评论中得到解答,但我建议您不要使用glob()
。您可以改为使用SPL迭代器:
<?php
$folder = __DIR__;
$pattern = '/^.*\.xml$/';
$iterator = new RecursiveDirectoryIterator($folder);
$iterator = new RecursiveIteratorIterator($iterator);
$iterator = new RegexIterator($iterator, $pattern);
$files = [];
foreach ($iterator as $file) {
$files []= $file->getFilename();
}
var_dump($files);
即使代码更大,我仍然觉得它更有用。好处如下:
您获得绝对路径,期限。只有原始模式也是绝对的时候才会出现glob()
。这不是很明显,不是吗?
实际上,您可以获得更多关于绝对路径的信息 - 您可以检查文件大小,所有者等。检查documentation on SplFileInfo。
第二个你发现自己需要处理递归模式,例如:
folder/*.xml
folder/branch/*.xml
folder/even/deeper/*.xml
...您将意识到PHP中没有内置的递归glob()
。
glob()
支持的模式多于简单*
。不幸的是,它们是barely documented:
glob()函数根据libc glob()函数使用的规则搜索匹配模式的所有路径名,这类似于常见shell使用的规则。
您是否真的想依赖libc
实施可能因任何原因而改变?
some random blog™上似乎最好地描述了glob()
实际支持的模式:
*
(星号)匹配零个多个字符。
?
完全匹配任何一个字符。
[...]
匹配组中的一个字符。一个组可以是一个字符列表,例如
[afkp]
或一系列字符,例如[a-g]
与[abcdefg]
相同。
[!...]
匹配不在组中的任何单个字符。
[!a-zA-Z0-9]
匹配任何非字母数字字符。
\
逃离下一个角色。对于特殊字符,这会导致它们不被视为特殊字符。例如,
\[
与文字[
匹配。如果标记包含GLOB_NOESCAPE
,则此引用将被禁用,\
将作为简单字符处理。
对我来说,使用正则表达式更具可读性。如果他们看到简单的正则表达式,人们就不太可能需要参考文档。