我有另一个问题。我有一个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文件?
提前感谢任何和所有回复。
答案 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虚拟机上运行它,所以唯一不同的信息是文件名,但这至少证明它依次读取每个文件,这正是我想要的行为见!