Помогите с PHP XMLReader

12
J
На сайте с 08.06.2006
Offline
844
4641

Есть такой xml

<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>

Вот таким кодом обрабатываю

while($reader->read()) {

if($reader->nodeType == XMLReader::ELEMENT) {

if($reader->localName == 'offer') {


print $reader->getAttribute('id')."\n";

$reader->read();

while ($reader->nodeType !== XMLReader::END_ELEMENT) {

$reader->read();
if ($reader->nodeType == XMLReader::ELEMENT and $reader->localName == 'param') {

print $reader->getAttribute('name')."\n";

$reader->read();
if($reader->nodeType == XMLReader::TEXT) {

print $reader->$value."\n";

}




}
}

}

}
}

В результате выводит только O14112180643

Ни атрибутов ни значения ноды "param" не выводит

Что я делаю не правильно?

Спасибо!

п.с. с самого утра мучаюсь

---------- Добавлено 28.12.2016 в 14:14 ----------

не срабатывает

 if ($reader->nodeType == XMLReader::ELEMENT and $reader->localName == 'param')
lutskboy
На сайте с 22.11.2013
Offline
185
#1
Есть такой xml

что то там не видно чтоб начиналось с xml

может так попробуйте

and $reader->name== 'param'

S
На сайте с 30.09.2016
Offline
469
#2

По-видимому, это образец записи.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
J
На сайте с 08.06.2006
Offline
844
#3
lutskboy:
что то там не видно чтоб начиналось с xml

начинается как нужно

Sitealert:
По-видимому, это образец записи.

именно так

S
На сайте с 30.09.2016
Offline
469
#4

Вот если "вприглядку" и навскидку - без меры понавтыкано $reader->read().

R
На сайте с 20.02.2015
Offline
59
#5

Гуглим php xmlreader to array на php.net находим хороший пример - копипестим.


error_reporting(-1);
header("content-type: text/plain; charset=utf-8");
function xml2assoc(&$xml){
$assoc = array();
$n = 0;
while($xml->read()){
if($xml->nodeType == XMLReader::END_ELEMENT) break;
if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
$assoc[$n]['name'] = $xml->name;
if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
$assoc[$n]['val'] = xml2assoc($xml);
$n++;
}
else if($xml->isEmptyElement){
$assoc[$n]['name'] = $xml->name;
if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
$assoc[$n]['val'] = "";
$n++;
}
else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
}
return $assoc;
}

$source = <<<XML
<?xml version="1.0"?>
<offers>
<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>

<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>
</offers>
XML;

$xml = new XMLReader();
$xml->XML($source);
$assoc = xml2assoc($xml);
print_r($assoc);

Чего там голову с утра ломать..

J
На сайте с 08.06.2006
Offline
844
#6

rereg, все что в этом примере можно через simpleXML одним махом проще сделать

в том и дело, что мне не нужно складывать все в один массив (xml большой)

нужно работать по элементно

---------- Добавлено 29.12.2016 в 12:32 ----------

еще не могу понять сам прием

как if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;

в нужные [$n]['val'] пишется текстовое значение без их указания ?

J
На сайте с 08.06.2006
Offline
844
#7
rereg:
Гуглим php xmlreader to array на php.net находим хороший пример - копипестим.

error_reporting(-1);
header("content-type: text/plain; charset=utf-8");
function xml2assoc(&$xml){
$assoc = array();
$n = 0;
while($xml->read()){
if($xml->nodeType == XMLReader::END_ELEMENT) break;
if($xml->nodeType == XMLReader::ELEMENT and !$xml->isEmptyElement){
$assoc[$n]['name'] = $xml->name;
if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
$assoc[$n]['val'] = xml2assoc($xml);
$n++;
}
else if($xml->isEmptyElement){
$assoc[$n]['name'] = $xml->name;
if($xml->hasAttributes) while($xml->moveToNextAttribute()) $assoc[$n]['atr'][$xml->name] = $xml->value;
$assoc[$n]['val'] = "";
$n++;
}
else if($xml->nodeType == XMLReader::TEXT) $assoc = $xml->value;
}
return $assoc;
}

$source = <<<XML
<?xml version="1.0"?>
<offers>
<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>

<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>
</offers>
XML;

$xml = new XMLReader();
$xml->XML($source);
$assoc = xml2assoc($xml);
print_r($assoc);

Чего там голову с утра ломать..

нужно не в массив складывать, а по одному элементу массива обрабатывать

как то никак не соображу как это реализовать использую приведенную функцию

S
На сайте с 30.09.2016
Offline
469
#8

joost, лови

while($reader->read()) {
if($reader->nodeType == XMLReader::ELEMENT) {
if($reader->localName == 'offer') {
print $reader->getAttribute('id')."\n";
$reader->read();
while ($reader->localName != 'offer') {
if($reader->nodeType == XMLReader::ELEMENT and $reader->localName == 'param') {
print $reader->getAttribute('name')."\n";
$reader->read();
if($reader->nodeType == XMLReader::TEXT) {
print $reader->value."\n";
}
}
$reader->read();
}
}
}
}
J
На сайте с 08.06.2006
Offline
844
#9
Sitealert:
joost, лови
while($reader->read()) {

if($reader->nodeType == XMLReader::ELEMENT) {
if($reader->localName == 'offer') {
print $reader->getAttribute('id')."\n";
$reader->read();
while ($reader->localName != 'offer') {
if($reader->nodeType == XMLReader::ELEMENT and $reader->localName == 'param') {
print $reader->getAttribute('name')."\n";
if($reader->nodeType == XMLReader::TEXT) {
print $reader->value."\n";
}
}
$reader->read();
}
}
}
}

Спасибо!

Но немного что-то не то

Для

$source = <<<XML

<?xml version="1.0"?>
<offers>
<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>

<offer available="true" id="O14112180643" type="vendor.model"><article>640295700752999</article><categoryId>1401000</categoryId><currencyId>RUR</currencyId><description>Комфортные треггинсы, содержат эластан для идеальной посадки, изделие дополнено кружевными вставками, широкий эластичный пояс, узкий крой штанин</description><model>Брюки Tom Tailor 640295700752999</model><modified_time>1482808144</modified_time><name>Брюки Tom Tailor 640295700752999</name><oldprice>4999</oldprice><param name="Пол">Женский</param><param name="Цвет">черный</param><param name="Размер" quantity="2" type="size" unit="EU">34/32</param><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-1b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-2b.jpg</picture><picture>http://tom-tailor-online.ru/images/P0/02/07/98/99/brjuki-tom-tailor-chernyjj-640295700752999-3b.jpg</picture><price>1500</price><topseller>false</topseller><topseller>false</topseller><url>https://ad.admitad.com/g/641a4c7cc1e181aacf623d89878ee1/?i=5&amp;ulp=http%3A%2F%2Ftom-tailor-online.ru%2Fshop%2Fproduct%2Fbrjuki-tom-tailor-640295700752999</url><vendor>tom tailor</vendor><vendorCode>640295700752999</vendorCode></offer>
</offers>
XML;

результат

O14112180643
Пол
Цвет
Размер
O14112180643
Пол
Цвет
Размер

$reader->value видит как пустое или его не видит

---------- Добавлено 29.12.2016 в 14:56 ----------

$xml->read();

забыл после определения нужной ноды, чтобы далее прочитать

S
На сайте с 30.09.2016
Offline
469
#10

Согласен, не обратил внимания. Исправил код.

---------- Добавлено 29.12.2016 в 14:25 ----------

joost:
$xml->read();
забыл после определения нужной ноды, чтобы далее прочитать
Это ещё что за $xml?
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий