Анализ на XML с PHP

Как така на намери. xml2array сигурно е най "популярната функция" на php :D

Код:
<?php


$xmlstring = '<Worksheet ss:Name=".Артикули">
<Table ss:ExpandedColumnCount="6" ss:ExpandedRowCount="7" x:FullColumns="1"
x:FullRows="1" ss:DefaultRowHeight="15">
<Column ss:Width="147"/>
<Column ss:Index="3" ss:Width="170.25"/>
<Column ss:Width="83.25"/>
<Column ss:Index="6" ss:Width="78"/>
<Row>
<Cell><Data ss:Type="String">Наименование БГ</Data></Cell>
<Cell><Data ss:Type="String">Артикулен номер</Data></Cell>
<Cell><Data ss:Type="String">Код</Data></Cell>
<Cell><Data ss:Type="String">Цена (без ДДС)</Data></Cell>
<Cell><Data ss:Type="String">Статус</Data></Cell>
<Cell><Data ss:Type="String">Категория 1</Data></Cell>
</Row>
<Row>
<Cell><Data ss:Type="String">RPT-800DU 800VA/AVR/USB</Data></Cell>
<Cell><Data ss:Type="String">00043</Data></Cell>
<Cell><Data ss:Type="String">RPT-800DU 800VA/AVR/USB</Data></Cell>
<Cell><Data ss:Type="Number">52.8</Data></Cell>
<Cell><Data ss:Type="String">.Aктивен</Data></Cell>
<Cell><Data ss:Type="String">Дамски обувки</Data></Cell>
</Row>
</Table>
</Worksheet>';

function XML2Array(SimpleXMLElement $string)
{
$array = array();

foreach ($string as $name => $element) {
($node = & $array[$name])
&& (1 === count($node) ? $node = array($node) : 1)
&& $node = & $node[];

$node = $element->count() ? XML2Array($element) : trim($element);
}

return $array;
}

$xml = @simplexml_load_string($xmlstring);
$array = @XML2Array($xml);
$array = array($xml->getName() => $array);

echo '<pre>';
print_r( $array );

ss: е namespace и сигурно затова си виждал доста екрани с грешка/предупреждения, така че или ги обработвай или ги игнорирай.


Това прави асоциативен масив с данните, но ти лесно може да си го модифицираш за да получиш това което искаш (по ключовете може да си направиш дърво :)).
 
@stuklen как да не става?
Кода който пейстнах по рано отпечатва на екрана асоциативен масив. Тоест от ключовете му си генерираш това което ти искаш.
 
На пръв поглед, се вижда, че не вади атрибути, а и на мен ми трябва да извади примерно първите 2 реда с полезна информация и да спре ( в случая първите 2<Row>), не да превърта целия xml.
 
Айде сега ново 20 ;). fopen->fread(buffer)/fgets->парс на ръчица explode/reg-exp->тъпчеш асоциативния масив.
Е верно играчка е ама това е ниско ниво.
На @Митрев кода изглежда ок обикаля си рекурсивно ама трудно се чете ;) може с цел да го е шортнал токоз :p.
 
Оффтопик. Каква е тази мода със "Записвам се". Там горе в дясно има копче "Следи темата" :)
 
Оффтопик. Каква е тази мода със "Записвам се". Там горе в дясно има копче "Следи темата" :)
И от тоя човек чакахме да интегрира обратно репите във форума :eek:
 
Благодаря за помощта на @amitev. Писах по-горе, че дадения пример не изважда атрибутите и автоматично това отпада.
Писах, че и някой ако помогне с решение, ще си заплатя, и това не помогна.
Към момента намерих решение и тествам с различни формати на XML, CSV, Plain text
Сега просто ще са ми нужни различни фийдове да тествам.
 
Май трябва пак да обясниш какво точно ти трябва защото явно или не разбора или ти не разбираш примерите които ти дадоха.
 
То какво да се обяснява повече. Трябва да се направи скрипт, който да може да чете XML-и с всякаква структура и данните да се превеждат към масив с определена структура.
Давайте XML с продукти да тествам или каквито и да е фийдове.
 
То какво да се обяснява повече. Трябва да се направи скрипт, който да може да чете XML-и с всякаква структура и данните да се превеждат към масив с определена структура.
Давайте XML с продукти да тествам или каквито и да е фийдове.
Такова задание за мене отива към:
 
Да споделя и аз малко опит. Като цяло "XML-и с всякаква структура" си е по-скоро утопия. Но може да се сведе до горе долу 2 основни (по-разпространени) типа. Единият е посочен в примера, при който всяка колона е различен атрибут. Товая много наподобява примерно на логиката на работа на тотал импорт про, при което всяка колона може да се мапне към съответното поле в базата от данни. Другият вариант е XML-a да е с дървовидна структура (йерархично), при което първото ниво може да е списък от продукти или категории, следващото ново да е самият продукт и на последното ниво да са атрибутите на продукта, заглавие, цена и т.н. И пак всичко е мега условно, понеже в някой фийдове варианта на продукта (цват/размер), ако разбирасе има такъв, е описан в атрибута на полето за цената, в друг вариант вариантите на продуктите са като отделни продукти с атрибут за продукта родител, а в трети са като отделен сет цена, цват, размер в рамките на самият продукт.
Отделно не винаги цялата информация е в 1 файил На последък (може и аз да съм карък) но вс епопадам на фийдове с по няколко различни типа файлове. Примерно проиводители, категории и продукти са в 3 отделни файла. Или размери/цветове са във фаил различен от продуктовият.
Кто цяло преди време и аз мислех дали не може да се унифицира и в крайна сметка много по-лесно се оказа да дописвам частта която се отнася до обработката на XML файла (или каквото е изсточника, JSON, CSV, etc). Реално това е максимум 30-40 реда код, който е различен за всеки фийд и не си струва времето и усилието да се прави универсално. С други думи казано интерфейс, който винаги свежда структурата на изсточника до тази която ми е необходима.
Ако трябва да обобщя. Не е невъзможно да се направи да работи в 90% от случаите, но първо трябва да се анализира кои структури са често срещани. Отделно трябва да предвидиш доста голям резурс за изпълнението на задачата. Според мен от порядъка на няколко месеца ще са нужни да се изчистят по-голямата част от бъговете.
Поздрави.
 
В общи линии така стоят нещата с фийдовете. Мислил съм си и за варианта с драйвер за различните видове структури, но реших да опитам първо така.
Задачата не е никак проста. Успял съм да ги доведа нещата до някакво решение. Ако не стане, ще мина на горния вариант с драйверите.
 
А защо ти е да се гърбиш като негър, целта каква е?
Модул за XML импорт или?
 

Горе