Войти

Показать полную графическую версию : Сложности в работе с классом XMLReader (XML -> Excel)


Artem-Samsung
10-08-2010, 16:14
Воспользовался руководством:
http://comp.dmkos.ru/publ/10-1-0-128

$reader = new XMLReader();

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

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

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

Artem-Samsung
10-08-2010, 23:58
Теперь выдает
Неправильный XML

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

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

Artem-Samsung
11-08-2010, 01:13
да-да. он самый.
но тем не мение, это как бы не влияет на тот цикл, а он похоже не работает :(

Sham
11-08-2010, 01:48
код заточен под определенный xml файл (с тегами Element1, Element11 и т.д.). подразумевается, что поменяете на свои, и структура другая...

тут (http://docs.php.net/manual/en/class.xmlreader.php#93842) в комментах предлагаются более универсальные решения (также в комментах к другим методам этого класса).

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

Artem-Samsung
11-08-2010, 01:55
Спасибо. Буду пробовать

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

Настройка скрипта PEAR::Spreadsheet_Excel_Writer (http://forum.oszone.ru/thread-182583.html)

Файл 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
$reader = new XMLReader();

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

$reader->setParserProperty(XMLReader::VALIDATE, false);
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(0, 1, 'Бренд');
$worksheet->write(0, 2, 'Модель');

$worksheet->write(0, 3, 'Цена: грн');
$worksheet->write(0, 4, 'Цена: usd');
$worksheet->write(0, 5, 'Цена: eur');
$worksheet->write(0, 6, 'Ссылка');


$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($i, 2, $model);
$worksheet->write($i, 0, $i);
break;
}

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

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

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

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

if ($reader->name == "vendor")
{
$reader->read();
$brand = trim($reader->value);
$worksheet->write($i, 1, $brand);

$i++;
break;
}
}
}
// Let's send the file
$workbook->close();
?>


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




© OSzone.net 2001-2012