На входе есть XML(массив) примерно следующей структуры
<CONTENT>
<COMP_CODE>717</COMP_CODE>
<LANG>en</LANG>
<COMP_CODE_BUYER>3435467</COMP_CODE_BUYER>
<SEARCH_CODE></SEARCH_CODE>
<MANUFACTURER_NAME></MANUFACTURER_NAME>
<TYPE_NAME></TYPE_NAME>
<SUPPLY_TYPE></SUPPLY_TYPE>
<PRICES>
<PRICE>
<WIC>ACCFLP001</WIC>
<DESCRIPTION>OTHER VENDORS</DESCRIPTION>
<VENDOR_NAME>OTHER VENDORS</VENDOR_NAME>
<GROUP_NAME>product group</GROUP_NAME>
<VPF_NAME />
<CURRENCY_CODE>EUR</CURRENCY_CODE>
<AVAIL>0</AVAIL>
<RETAIL_PRICE>0.00</RETAIL_PRICE>
<MY_PRICE>0.00</MY_PRICE>
<WARRANTYTERM />
<GROUP_ID>31</GROUP_ID>
<VENDOR_ID>2</VENDOR_ID>
<SMALL_IMAGE>http://domen.ru/image.jpg</SMALL_IMAGE>
<PRODUCT_CARD>http://domen.ru/link_to_product.html</PRODUCT_CARD>
<EAN />
</PRICE>
<PRICE>
<WIC>ACCFLP002</WIC>
<DESCRIPTION>OTHER VENDORS</DESCRIPTION>
<VENDOR_NAME>OTHER VENDORS</VENDOR_NAME>
<GROUP_NAME>product group</GROUP_NAME>
<VPF_NAME />
<CURRENCY_CODE>EUR</CURRENCY_CODE>
<AVAIL>0</AVAIL>
<RETAIL_PRICE>0.00</RETAIL_PRICE>
<MY_PRICE>0.00</MY_PRICE>
<WARRANTYTERM />
<GROUP_ID>31</GROUP_ID>
<VENDOR_ID>2</VENDOR_ID>
<SMALL_IMAGE>http://domen.ru/image.jpg</SMALL_IMAGE>
<PRODUCT_CARD>http://domen.ru/link_to_product.html</PRODUCT_CARD>
<EAN />
</PRICE>
</PRICES>
</CONTENT>
На выходе надо получить XML(массив) следуюшей структуры:
Array(
[CONTENT] => Array(
[COMP_CODE],
[LANG],
[COMP_CODE_BUYER],
[SEARCH_CODE],
[MANUFACTURER_NAME],
[TYPE_NAME],
[SUPPLY_TYPE],
[PRICES] => Array(
[PRICE] = Array(
[WIC],
[DESCRIPTION],
[VENDOR_NAME],
[GROUP_NAME],
[VPF_NAME],
[CURRENCY_CODE],
[AVAIL],
[RETAIL_PRICE],
[MY_PRICE],
[WARRANTYTERM],
[GROUP_ID],
[VENDOR_ID],
[SMALL_IMAGE],
[PRODUCT_CARD],
[EAN]
)
)
)
)
Это могут быть не обязательно ключи, можно и вместо значений названия полей подставлять, но главная идея, что надо вытащить именно структуру а не сами данные(PRICE в данном случае будет повторяться только один раз).
Сам массив не должен содержать данные.
Это очень похоже на описание схемы XML документа.
Если у кого то есть уже готовый код, буду очень признателен или может ктото словесно реализацию средствами PHP подскажет.
Заранее спасибо!!!
Спустя 1 час, 59 минут, 13 секунд (14.07.2010 - 02:51) Ice написал(а):
то, что первым пришло в голову:
$string = <<<XML
<a>
<b>
<c>text</c>
<c>stuff</c>
</b>
<dd>
<c>code</c>
</dd>
</a>
XML;
$xmlIterator = new SimpleXMLIterator($string);
print '<pre>';
print_r($xmlIterator);
print '</pre>';
Спустя 8 часов, 1 минута, 19 секунд (14.07.2010 - 10:52) mor22 написал(а):
Ice
Это простой вывод XML-а, мне же надо не весь XML вывести, а только структуру.
В данном примере тег [PRICE] будет повторяться более чем 10 000 раз, где тег [PRICE] нужен только один, причем динамически.
Напишу небольшое предназначение, для большего понятия вопроса.
Есть на входе большой XML файл (10-20 MB), надо динамически сгенерировать массив, который будет отображать только его сруктуру. Структура обычно максимально простая и ее можно будет корректно отобразить для последующих действий.
Это простой вывод XML-а, мне же надо не весь XML вывести, а только структуру.
В данном примере тег [PRICE] будет повторяться более чем 10 000 раз, где тег [PRICE] нужен только один, причем динамически.
Напишу небольшое предназначение, для большего понятия вопроса.
Есть на входе большой XML файл (10-20 MB), надо динамически сгенерировать массив, который будет отображать только его сруктуру. Структура обычно максимально простая и ее можно будет корректно отобразить для последующих действий.
Спустя 11 месяцев, 22 дня, 7 часов, 41 минута, 4 секунды (6.07.2011 - 18:33) mor22 написал(а):
Нашел решение, не самое красивое, но все же работает
ini_set('display_errors', 1);
//error_reporting(E_ALL);
ini_set("memory_limit","512M");
//print_r(xml_parse_into_assoc("tst.xml"));
print_r(xml_parse_into_assoc_struct(file_get_contents("test.xml")));
function xml_parse_into_assoc_struct($data) {
//$data = implode("", file($file));
$p = xml_parser_create();
xml_parser_set_option($p, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($p, $data, $vals, $index);
xml_parser_free($p);
$levels = array(null);
foreach ($vals as $val) {
if ($val['type'] == 'open' || $val['type'] == 'complete') {
if (!array_key_exists($val['level'], $levels)) {
$levels[$val['level']] = array();
}
}
$prevLevel =& $levels[$val['level'] - 1];
$parent = $prevLevel[sizeof($prevLevel)-1];
if ($val['type'] == 'open') {
$val['children'] = array();
array_push(&$levels[$val['level']], $val);
continue;
}
else if ($val['type'] == 'complete') {
$parent['children'][$val['tag']] = $val['value'];
}
else if ($val['type'] == 'close') {
$pop = array_pop($levels[$val['level']]);
$tag = $pop['tag'];
if ($parent) {
if (!array_key_exists($tag, $parent['children'])) {
$parent['children'][$tag] = $pop['children'];
}
else if (is_array($parent['children'][$tag])) {
//$parent['children'][$tag][] = $pop['children'];
}
}
else {
return(array($pop['tag'] => $pop['children']));
}
}
$prevLevel[sizeof($prevLevel)-1] = $parent;
}
}