Simplexml загрузить файл из массива - PullRequest
1 голос
/ 25 апреля 2011

Алоха каждый,

У меня есть другой вопрос. У меня есть сценарий SYDI, который извлекает данные WMI с компьютеров Windows, затем добавляет метку времени в конец файла и, наконец, сохраняет ее в общий ресурс на сервере. Код 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 ]

1 голос
/ 25 апреля 2011

попробуйте это:

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);
}
0 голосов
/ 26 апреля 2011

Как я положил в комментарии выше, теперь все решено! Я проверил свою теорию, прочитав часть данных в одном из тегов. Вот код, который работает:

// 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

Я запускаю это на моей виртуальной машине с Windows 7 на моем MacBook Pro, поэтому единственная различающаяся информация - это имя файла, но это, по крайней мере, доказывает, что он читает каждый файл по очереди, и это именно то поведение, которое я хочу см!

...