Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Сложности в работе с классом XMLReader (XML -> Excel)

Ответить
Настройки темы
Сложности в работе с классом XMLReader (XML -> Excel)

Аватара для Artem-Samsung

Ветеран


Сообщения: 823
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Изменения
Автор: Artem-Samsung
Дата: 13-08-2010
Воспользовался руководством:
http://comp.dmkos.ru/publ/10-1-0-128

PHP код: Выделить весь код

$reader = new XMLReader();


if (!
$reader->open('http://djone.com.ua/market.xml')) {
die(
'Не удалось открыть файл');
}

$reader->setParserProperty(XMLReader::VALIDATEtrue);
if (!
$reader->isValid()) {
die(
'Неправильный XML');
}

while (
$reader->read()) {
 if ((
$reader->nodeType == XMLReader::ELEMENT) && ($reader->name == 'Element1')) {
   
// считываем атрибуты
   
$xmlarr[$idx]['Attr1'] = $reader->getAttribute('Attr1');

   while (
$reader->read()) {
     
// разбираем вложенные элементы
     
if (($reader->nodeType == XMLReader::ELEMENT) && ($reader->name == 'Element11')) {
       while (
$reader->read()) {
         if (
$reader->nodeType == XMLReader::TEXT) {
           
// получаем значение из свойства $reader->value;
           
$xmlarr[$idx][$reader->name] = $reader->value;
         }
         elseif ((
$reader->nodeType == XMLReader::ELEMENT) && ($reader->name == 'Element111')) {
           
// еще один вложенный элемент
           
while ($reader->read()) {
             if (
$reader->nodeType == XMLReader::TEXT/* и т.д. */ {
               
$xmlarr[$idx]['Element11'][$reader->name] = $reader->value;
             }
             elseif ((
$reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == 'Element111')) {
               break;
             }
           }
         }
         elseif ((
$reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == 'Element11')) {
           break;
         }
       }
     }
     elseif ((
$reader->nodeType == XMLReader::ELEMENT) && ($reader->name == 'Element12')) {
       while (
$reader->read()) {
         if (
$reader->nodeType == XMLReader::TEXT) {
           
// ... = $reader->value;
         
}
         elseif ((
$reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == 'Element12')) {
           break;
         }
       }
     }
     elseif ((
$reader->nodeType == XMLReader::END_ELEMENT) && ($reader->name == 'Element1')) {
       
$idx += 1;
       break;
     }
   }
 }



Получаю ошибки:
Код: Выделить весь код
Warning: XMLReader::read() [xmlreader.read]: http://djone.com.ua/market.xml:2: validity error : Validation failed: no DTD found ! in /web/sites/deykun.com/djone/xml.php on line 15
Warning: XMLReader::read() [xmlreader.read]: <market> in /web/sites/deykun.com/djone/xml.php on line 15
Warning: XMLReader::read() [xmlreader.read]: ^ in /web/sites/deykun.com/djone/xml.php on line 15
Warning: XMLReader::read() [xmlreader.read]: An Error Occured while reading in /web/sites/deykun.com/djone/xml.php on line 15

line 15 - это
Код: Выделить весь код
while ($reader->read()) {
Чтение XML: http://djone.com.ua/market.xml
Выполнение скрипта: http://deykun.com/djone/xml.php

-------
Мой блог Web Development


Отправлено: 16:14, 10-08-2010

 

Deadooshka


Сообщения: 2512
Благодарности: 690

Профиль | Отправить PM | Цитировать


если схемы нет, то зачем валидация? схема - это описание возможных тегов.
Цитата Artem-Samsung:
$reader->setParserProperty(XMLReader::VALIDATE, true); »
в false
Цитата Artem-Samsung:
if (!$reader->isValid()) {
die('Неправильный XML');
} »
это тогда тоже не нужно (имхо)

ну и имена тегов и атрибутов дб реальные (не Element11 и т.д.)...
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:49, 10-08-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Artem-Samsung

Ветеран


Сообщения: 823
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Теперь выдает
Неправильный XML

И массив $xmlarr пуст

-------
Мой блог Web Development


Отправлено: 23:58, 10-08-2010 | #3


Deadooshka


Сообщения: 2512
Благодарности: 690

Профиль | Отправить PM | Цитировать


Цитата Artem-Samsung:
Теперь выдает
Неправильный XML »
небось этот код
Цитата Artem-Samsung:
if (!$reader->isValid()) {
die('Неправильный XML');
} »
срабатывает... (который я предложил удалить/закоментить, ибо он проверяет валидацию)

Отправлено: 01:06, 11-08-2010 | #4


Аватара для Artem-Samsung

Ветеран


Сообщения: 823
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


да-да. он самый.
но тем не мение, это как бы не влияет на тот цикл, а он похоже не работает

-------
Мой блог Web Development


Отправлено: 01:13, 11-08-2010 | #5


Deadooshka


Сообщения: 2512
Благодарности: 690

Профиль | Отправить PM | Цитировать


код заточен под определенный xml файл (с тегами Element1, Element11 и т.д.). подразумевается, что поменяете на свои, и структура другая...

тут в комментах предлагаются более универсальные решения (также в комментах к другим методам этого класса).

в любом случае нужно затачивать под свой формат xml-файла.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:48, 11-08-2010 | #6


Аватара для Artem-Samsung

Ветеран


Сообщения: 823
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Спасибо. Буду пробовать

-------
Мой блог Web Development


Отправлено: 01:55, 11-08-2010 | #7


Аватара для Artem-Samsung

Ветеран


Сообщения: 823
Благодарности: 53

Профиль | Сайт | Отправить PM | Цитировать


Изображения
Тип файла: jpg 1.jpg
(489.2 Kb, 5 просмотров)

Вообщем что мне нужно было?
Есть файл XML со всеми ценами, моделями и ссылками Интернет магазина.
Нужно было создать файл Excel, который бы все это помещал в поля.

Настройка скрипта PEAR::Spreadsheet_Excel_Writer

Файл xml с такой структурой:

Код: Выделить весь код
<item id="1">
<name>Vestax CDX 05</name>
<UAH>4424</UAH>
<USD>433.7</USD>
<EUR>560</EUR>
<url>http://djone.com.ua/CD-proigryvateli/1/CDX_05.htm</url>
<vendor>Vestax</vendor>
</item>
−
<item id="2">
<name>Vestax CDR 07</name>
<UAH>7054.7</UAH>
<USD>691.6</USD>
<EUR>893</EUR>
<url>http://djone.com.ua/CD-proigryvateli/2/CDR_07.htm</url>
<vendor>Vestax</vendor>
</item>
Скрипт создания Excel Файла:

PHP код: Выделить весь код

<?php

$reader 
= new XMLReader();

if (!
$reader->open('http://djone.com.ua/market.xml')) {
 die(
'Не удалось открыть файл');
}

$reader->setParserProperty(XMLReader::VALIDATEfalse);
require_once 
'Spreadsheet/Excel/Writer.php';

// Creating a workbook
$workbook = new Spreadsheet_Excel_Writer();

// sending HTTP headers
$workbook->send('djone-price.xls');

// Creating a worksheet
$worksheet =& $workbook->addWorksheet('Price');

// The actual data


$worksheet->write(01'Бренд');
$worksheet->write(02'Модель');

$worksheet->write(03'Цена: грн');
$worksheet->write(04'Цена: usd');
$worksheet->write(05'Цена: eur');
$worksheet->write(06'Ссылка');


$xmlarr = array();
$idx 0;

$i 1;

while (
$reader->read()) {
 switch (
$reader->nodeType) {
   case (
XMLREADER::ELEMENT):

if (
$reader->name == "name")
     {
       
$reader->read();
       
$model trim($reader->value);
    
$worksheet->write($i2$model);
    
$worksheet->write($i0$i);
       break;
     }

 if (
$reader->name == "UAH")
     {
       
$reader->read();
       
$price1 trim($reader->value);
    
$worksheet->write($i3$price1);
       break;
     }

 if (
$reader->name == "url")
     {
       
$reader->read();
       
$url trim($reader->value);
    
$worksheet->write($i6$url);
       break;
     }

 if (
$reader->name == "EUR")
     {
       
$reader->read();
       
$price3 trim($reader->value);
    
$worksheet->write($i5$price3);
       break;
     }

 if (
$reader->name == "USD")
     {
       
$reader->read();
       
$price2 trim($reader->value);
    
$worksheet->write($i4$price2);
       break;
     }

 if (
$reader->name == "vendor")
     {
       
$reader->read();
       
$brand trim($reader->value);
    
$worksheet->write($i1$brand);
    
    
$i++;
       break;
     }
}
}
// Let's send the file
$workbook->close();
?>

Надеюсь кому то поможет.

-------
Мой блог Web Development

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:17, 13-08-2010 | #8



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Сложности в работе с классом XMLReader (XML -> Excel)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
сложности с обновлением нод32 сергей never Лечение систем от вредоносных программ 4 11-06-2010 21:14
Wireless - Сложности с настройкой WiFi сети. NordWest Сетевое оборудование 0 18-09-2009 03:13
Прочее - Сложности доступа к сетевым дискам Novell-сервера akalibr Сетевые технологии 2 29-05-2009 14:35
Сложности при работе мыши (через ps/2, usb ,com - не имеет значения) Abonent Непонятные проблемы с Железом 6 02-07-2008 06:43




 
Переход