Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Криво работает парсер из XML. Помогите разобраться.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Nokse
Отправлено: 23 Января, 2010 - 13:49:46
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Сразу скажу что я новичек в php, но хочу научится)
Решил написать парсер данных из XML. Причина - программа сохраняет отчеты исключительно в XML. Из отчета надо достать конкретные данные.
для примера взял кусок отчета:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <event>
  2. <ProcessIndex>131</ProcessIndex>
  3. <Time_of_Day>23:34:55,4152887</Time_of_Day>
  4. <Process_Name>Portal.exe</Process_Name>
  5. <PID>2576</PID>
  6. <Operation>QueryDirectory</Operation>
  7. <Path>E:\Games\Portal Antology</Path>
  8. <Result>NO MORE FILES</Result>
  9. <Detail></Detail>
  10. </event>

Из всего этого мне надо вытащить только информацию, заключенную между тегами <Process_Name></Process_Name> и <Path></Path> (хотябы)
Ну и вот собственно то, что я написал:
PHP:
скопировать код в буфер обмена
  1. <?
  2. $res = "";
  3. function startElement($parser, $name, $attrs) {
  4. global $res;
  5.  
  6. switch ($name) {
  7.         case '<PROCESS_NAME>':
  8.             $res = $str;
  9.             break;
  10.         case '<PATH>':
  11.             $res = $str;
  12.             break;
  13.                 }
  14.  echo $res.'<br>';
  15. }
  16.  
  17. function endElement($parser, $name) {}
  18.  
  19. function stringElement($parser, $str)
  20. {
  21. if (strlen(trim($str)) > 0)
  22. {
  23. $str= mb_convert_encoding($str,'windows-1251', 'UTF-8');//конвертируем строку из UTF-8 в windows-1251
  24. echo $str.'<br>';
  25. }
  26. }
  27.  
  28. $file = "C:\Documents and Settings\Dark Soul\Рабочий стол\Logfile4.XML";
  29.  
  30. $xml_parser = xml_parser_create();
  31.  
  32. xml_set_element_handler($xml_parser, "startElement", "endElement");
  33. xml_set_character_data_handler($xml_parser, "stringElement");
  34. if (!($fp = fopen($file, "r"))) {
  35. die("Error while opening file");
  36. }
  37.  
  38. while ($data = fgets($fp)) {
  39. if (!xml_parse($xml_parser, $data, feof($fp))) {
  40. echo "<br>XML Error: ";
  41. echo " at line ".xml_get_current_line_number($xml_parser);
  42. break;
  43. }
  44. }
  45.  
  46. xml_parser_free($xml_parser);
  47.  
  48. ?>


Не могу понять свою ошибку...

ПС. В идеале хотелось бы, чтобы результат парсинга выглядел как табличка из четырех столбцов: в первом значение Process_Name, во втором Path,в третьем Operation и в четвертом Result

(Отредактировано автором: 23 Января, 2010 - 13:51:12)

 
 Top
Мелкий Супермодератор
Отправлено: 23 Января, 2010 - 15:49:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




А simpleXML не проще будет?
http://www.php.su/functions/?cat=simplexml

PHP:
скопировать код в буфер обмена
  1. $xml = simplexml_load_file("файл XML");
  2. echo "<table border=1>";
  3. for ($i=0; $i<count($xml->event);$i++) {
  4.         echo "<tr><td>".$xml->event[$i]->Process_Name."</td><td>".
  5.                 $xml->event[$i]->Path."</td><td>".
  6.                 $xml->event[$i]->Operation."</td><td>".
  7.                 $xml->event[$i]->Result."</td></tr>";
  8.         };
  9. echo "</table>";

(Отредактировано автором: 23 Января, 2010 - 16:10:46)



-----
PostgreSQL DBA
 
 Top
JustUserR
Отправлено: 23 Января, 2010 - 17:41:54
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Nokse пишет:
$file = "C:\Documents and Settings\Dark Soul\Рабочий стол\Logfile4.XML";
Проэкранируйте все обратные слеши - а то путь может трактоваться неверно - или замените слеши на прямые (PHP допускает пути с прямыми слешами даже по windows)


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Nokse
Отправлено: 23 Января, 2010 - 18:15:53
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Мелкий, спасибо, но у меня почему-то ничего не происходит при использовании представленного вами кода (сразу говорю что я подставлял вместо "файл XML" адрес до нужного мне файла, естественно в двойных кавычках.) Поэтому вопрос - для работы с simpleXML надо какие-то дополнительные модули подключать, или он встроен в стандартный пхп ? простите уж за нубский вопрос)

JustUserR, спасибо за совет, я теперь буду учитывать эту деталь, но у меня файл открывается как раз нормально. Просто выборка идет вообще всего, что заключено между тегами, а не между конкретно мной заданными с помощью конструкции switch. Я понимаю, что где-то я очень глупо написал код, но не могу разобратся, где именно.
 
 Top
Мелкий Супермодератор
Отправлено: 23 Января, 2010 - 19:18:19
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Nokse пишет:
Поэтому вопрос - для работы с simpleXML надо какие-то дополнительные модули подключать, или он встроен в стандартный пхп ?

Он включен по-умолчанию.


Выводит структуру файла?
Я проверял работу на таком xml:
Спойлер (Отобразить)

Если у реального другая структура, то надо будет немного поменять код.


-----
PostgreSQL DBA
 
 Top
Nokse
Отправлено: 23 Января, 2010 - 19:31:56
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Мелкий нет, написало "Warning: simplexml_load_file(): I/O warning : failed to load external entity "Logfile4.XML" in C:\Sites\Home\localhost\www\warmblue\parser1.php on line 13 bool(false) "
Что интерестно, при использовании предыдущего кода ничего не писало.
В строке 13 находится $xml = simplexml_load_file("Logfile4.XML"); Называется именно так как и написал в строке загрузки файла.
Сам файл лежит в одной директории с фалом парсера для простоты.
Про структуру файла - вы почти угадали. Только у меня <eventlist> а не <events>

(Отредактировано автором: 23 Января, 2010 - 19:48:25)

 
 Top
Мелкий Супермодератор
Отправлено: 23 Января, 2010 - 21:29:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Тогда у меня хорошие идеи кончились. У меня работает нормально...
Файл точно лежит под таким именем рядом со скриптом? Функция жалуется, что не может загрузить этот файл...


-----
PostgreSQL DBA
 
 Top
Nokse
Отправлено: 23 Января, 2010 - 23:42:45
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Мелкий, точно с таким именем и точно в той же папке.
вот:
Честно, я сам в шоке Не понял
 
 Top
Мелкий Супермодератор
Отправлено: 23 Января, 2010 - 23:57:22
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




хм, а если зайти с другой стороны:
PHP:
скопировать код в буфер обмена
  1. $str = file_get_contents("Logfile4.XML");
  2. if ($str) {
  3. $xml = simplexml_load_string($str);
  4. var_dump($xml);
  5. } else echo "таки пусто в файл либо его не прочитали";

(Отредактировано автором: 23 Января, 2010 - 23:57:59)



-----
PostgreSQL DBA
 
 Top
Nokse
Отправлено: 24 Января, 2010 - 00:23:40
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Я сейчас мозгами двинусь....

"Warning: file_get_contents(Logfile4.XML): failed to open stream: No such file or directory in C:\Sites\Home\localhost\www\warmblue\parser1.php on line 2 "
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $str = file_get_contents("Logfile4.XML");
  3. if ($str) {
  4. $xml = simplexml_load_string($str);
  5. var_dump($xml);
  6. } else echo "таки пусто в файл либо его не прочитали";
  7.  
  8. ?>


и это при том что:
Спойлер (Отобразить)

(Отредактировано автором: 24 Января, 2010 - 00:24:08)

 
 Top
JustUserR
Отправлено: 24 Января, 2010 - 01:24:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Nokse Может быть относительный путь остановлен в другой директории - попробуйте указать по очереди виртуальный путь (С / от document_root) и абсолютный путь (Начиная с буквы диска)


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Nokse
Отправлено: 24 Января, 2010 - 15:42:50
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




JustUserR, спасибо, действительно, указав парсеру абсолютный путь к файлу я решил проблему с открытием файла и считыванием его в переменную с помощью simplexml_load_file. Но вот попытки сделать выборку из XML не привели к успеху... и я затрудняюсь сказать почему...
 
 Top
JustUserR
Отправлено: 24 Января, 2010 - 16:06:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




Nokse пишет:
JustUserR, спасибо, действительно, указав парсеру абсолютный путь к файлу я решил проблему с открытием файла и считыванием его в переменную с помощью simplexml_load_file
Пожалуйста Улыбка Действительно при различных настроках PHP использует различные пути в качестве базовых (А библиотеки могут использовать еще свои) поэтому лучше указывать абсолютные пути если появляется непонятная ошибка отсутствия файла когда он на самом деле есть Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Nokse
Отправлено: 24 Января, 2010 - 16:28:23
Post Id


Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Янв. 2010  


Помог: 0 раз(а)




Используя метод научного тыка, все же получилось с горем пополам сделать выборку из файла. Но таким кодом, что я сам не понимаю, почему оно работает.
Код ниже:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.     $str = file_get_contents("C:\Sites\Home\localhost\www\warmblue\Logfile4.XML");
  3.   if ($str) {
  4. $xml = simplexml_load_string($str);
  5. var_dump($xml);
  6. echo "<br>";
  7. } else echo "таки пусто в файл либо его не прочитали";
  8. $xml = simplexml_load_string($str);
  9. foreach($xml->event as $event)
  10. {
  11.         echo $event->Process_Name."<br>";
  12.         echo $event->Path."<br>";
  13.         echo $event->Operation."<br>";
  14.         echo $event->Result."<br>";
  15.         }
  16. ?>


Но что самое интерестное, как только я закоментировал строку 4 и 5, все перестало работать. Тоесть вообще ничто не передается на вывод, если закоментировать 4, и 5 строки... я в недоумении...
 
 Top
Мелкий Супермодератор
Отправлено: 24 Января, 2010 - 17:57:00
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Какой-то у вас странный PHP Однако


-----
PostgreSQL DBA
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB