Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Сложности в работе с классом XMLReader (XML -> Excel) (http://forum.oszone.net/showthread.php?t=182592)

Artem-Samsung 10-08-2010 16:14 1470862

Сложности в работе с классом XMLReader (XML -> Excel)
 
Воспользовался руководством:
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

Sham 10-08-2010 20:49 1471002

если схемы нет, то зачем валидация? схема - это описание возможных тегов.
Цитата:

Цитата Artem-Samsung
$reader->setParserProperty(XMLReader::VALIDATE, true); »

в false
Цитата:

Цитата Artem-Samsung
if (!$reader->isValid()) {
die('Неправильный XML');
} »

это тогда тоже не нужно (имхо)

ну и имена тегов и атрибутов дб реальные (не Element11 и т.д.)...

Artem-Samsung 10-08-2010 23:58 1471117

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

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

Sham 11-08-2010 01:06 1471148

Цитата:

Цитата Artem-Samsung
Теперь выдает
Неправильный XML »

небось этот код
Цитата:

Цитата Artem-Samsung
if (!$reader->isValid()) {
die('Неправильный XML');
} »

срабатывает... (который я предложил удалить/закоментить, ибо он проверяет валидацию)

Artem-Samsung 11-08-2010 01:13 1471150

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

Sham 11-08-2010 01:48 1471155

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

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

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

Artem-Samsung 11-08-2010 01:55 1471158

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

Artem-Samsung 13-08-2010 18:17 1473080

Вложений: 1
Вообщем что мне нужно было?
Есть файл 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();
?>

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


Время: 03:56.

Время: 03:56.
© OSzone.net 2001-