[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: DTD Schema из XML -а
mor22
Доброе время суток, не подскажете ли решение (скрипт) для следующей задачи:
На входе есть 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), надо динамически сгенерировать массив, который будет отображать только его сруктуру. Структура обычно максимально простая и ее можно будет корректно отобразить для последующих действий.

Спустя 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;
}
}

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.