Simplexml从数组加载文件

时间:2011-04-25 07:39:19

标签: php file simplexml external

大家阿罗哈,

我有另一个问题。我有一个SYDI脚本从Windows计算机检索WMI数据,然后在文件末尾附加时间戳,最后将其保存到服务器上的共享。我必须阅读并打印文件名的PHP代码如下所示:

if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            if ($file != "." && $file != "..") {
                $results[] = $file;
                echo $file . "<br />";
            }
        }
        closedir($dh);      
    }
}

一切都很好,文件名如下所示返回:

sydiResult-24-Apr-11-18-59-52.xml
sydiResult-24-Apr-11-19-00-32.xml
sydiResult-24-Apr-11-19-01-17.xml

我尝试使用simplexml按顺序调用文件,看看我是否可以使用以下代码:

for ($i = 0; $i < sizeof($results); $i++) {
    $xml = simplexml_load_file($results[$i]);
}

但是我收到错误,表明simplexml无法打开外部xml文件。 php文件位于我的htdocs目录中,xml文件位于htdocs目录中的一个名为sydiResults的目录中。我想分离sydi xml文件,所以我决定创建子目录。这可能是简单的xml不起作用的原因吗?

我的计划很简单:打开xml文件并从中提取某些信息,然后循环到下一个xml文件,从中提取某些信息,然后......依此类推,直到我到达最后一个xml文件在目录中。有没有人知道如何使用simplexml,或者我是否可以使用simplexml依次打开每个xml文件?

提前感谢任何和所有回复。

2 个答案:

答案 0 :(得分:1)

试试这个:

for ($i = 0; $i < sizeof($results); $i++) {
$file = 'sydiResults/'.$results[$i];
if (file_exists($file)) {
   $xml = simplexml_load_file($file);
    print_r($xml);
 }
else {
exit('Failed to open '.$file);
}

答案 1 :(得分:0)

正如我在上面的评论中所说,现在一切都解决了!我通过读取其中一个标签中的部分数据来测试我的理论。以下是有效的代码:

// Open a known directory, and proceed to read its contents
if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
            // Check for the items not desired to be read into the $results array, then fill the array
            if ($file != "." && $file != ".." && $file != "syditest01.php" && $file != "sydi.bat" && $file != "sydi-server.vbs") {
                $results[] = $file;
                // Echo the filenames retrieved as they are read
                echo $file . "<br />";
            }
        }
        echo "<br /> <br />";
            for ($i = 0; $i < sizeof($results); $i++) {
                // Verify that only the desired filenames are actually in the array
                echo "Found file: $results[$i] <br />";
                // Load the files using the simplexml_load_file() method
                $xml = simplexml_load_file($results[$i]);
                // Read each filename after it gets read by the method above
                echo $results[$i] . " should be loaded now. <br />";
                // The foreach() loop extracts the data for the InventoryItems table,then the resulting data is 
                //  assigned a variable to use in the INSERT statemsnt for the database.
                foreach($xml->machineinfo[0]->attributes() as $a => $b)
                {
                    // Fill the $info array with the attributes of the machineinfo xml tag
                    $info[] = $b;
                }
                // Echo the attributes in the desired order for the INSERT statement for entry into the database
                echo $info[2], "<br />";
                echo $info[0], "<br />";
                echo $info[1], "<br />";
                echo $info[3], "<br /><br />";
            }
        closedir($dh);      
    }
}

结果如下:

sydiResult-24-Apr-11-18-59-52.xml
sydiResult-24-Apr-11-19-00-32.xml
sydiResult-24-Apr-11-19-01-17.xml
sydiResult-25-Apr-11-13-08-52.xml
sydiResult-25-Apr-11-13-10-47.xml
sydiResult-25-Apr-11-13-12-01.xml


Found file: sydiResult-24-Apr-11-18-59-52.xml 
sydiResult-24-Apr-11-18-59-52.xml should be loaded now. 
VMware-56 4d 96 72 5e ec d8 5d-e0 f3 b2 ba 2a 55 72 5b
VMware, Inc.
VMware Virtual Platform
Other

Found file: sydiResult-24-Apr-11-19-00-32.xml 
sydiResult-24-Apr-11-19-00-32.xml should be loaded now. 
VMware-56 4d 96 72 5e ec d8 5d-e0 f3 b2 ba 2a 55 72 5b
VMware, Inc.
VMware Virtual Platform
Other

Found file: sydiResult-24-Apr-11-19-01-17.xml 
sydiResult-24-Apr-11-19-01-17.xml should be loaded now. 
VMware-56 4d 96 72 5e ec d8 5d-e0 f3 b2 ba 2a 55 72 5b
VMware, Inc.
VMware Virtual Platform
Other

Found file: sydiResult-25-Apr-11-13-08-52.xml 
sydiResult-25-Apr-11-13-08-52.xml should be loaded now. 
VMware-56 4d 96 72 5e ec d8 5d-e0 f3 b2 ba 2a 55 72 5b
VMware, Inc.
VMware Virtual Platform
Other

我在我的MacBook Pro上的Windows 7虚拟机上运行它,所以唯一不同的信息是文件名,但这至少证明它依次读取每个文件,这正是我想要的行为见!