Мне нужно загрузить тонну XML-каналов и сохранить информацию в базе данных. Я не могу контролировать поля XML, но они обычно содержат уникальный идентификатор, заголовок, валюту, цену и продолжительность.XML-теги в базе данных
код ниже работает нормально только на 1 корм:
function process_xml_file($path, $adv_id)
{
$xml = simplexml_load_file($path, 'SimpleXMLElement', LIBXML_NOCDATA);
$data = array();
$finished = array();
$counter = 0;
// loop through all items
foreach($xml->product as $product)
{
$product_id = strip_tags((string)$product->productID);
if(!in_array($product_id, $finished))
{
$country = $product->xpath('./extra/field[@name="country"]');
$data[$counter]['country'] = strip_tags((string)$country[0]);
$data[$counter]['title'] = strip_tags((string)$product->name);
$data[$counter]['currency'] = strip_tags((string)$product->price['currency']);
$data[$counter]['price'] = strip_tags((string)$product->price);
$duration = $product->xpath('./extra/field[@name="duration"]');
$data[$counter]['duration'] = strip_tags((string)$duration[0]);
// add this product to the finished array, we want to exclude duplicates
$finished[$counter] = $product_id;
$counter++;
}
}
return $data; // the data will be saved to database in an other method
}
Я думал о сохранении вещи, как prod_id и XPath (»./ дополнительных/поле [@ имя = "страна" ] ') в базе данных, поэтому я могу легко получить значения разных полей поля, используя eval(). Я знаю, что eval() - это зло, и я открыт для лучших предложений. Я единственный, кто обрабатывает такие данные, поэтому вероятность eval() может быть несколько меньше обычной.
Получение product_id и название отлично работает, проблема в стране и продолжительность использования XPath, Eval() выдаст ошибку, как:
Parse error: syntax error, unexpected '"xpath('./additional/field[@na' (T_CONSTANT_ENCAPSED_STRING), expecting identifier (T_STRING) or variable (T_VARIABLE) or '{' or '$' in C:\xampp\htdocs\project\feed.php(220) : eval()'d code on line 1
Пример:
// simple xml object of all products
$children = $xml->children();
$country = $tag['country']; // $tag is from the db
// loop through all products
foreach($children as $product)
{
$id = strip_tags($product->$product_id);
$country = $product->$country;
eval("\$country2 = \$product->\"{$country}\";");
echo $country2;
}
Мой таблицу базы данных :
CREATE TABLE IF NOT EXISTS `tbl_feeds_xml_tags` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`feed_id` int(11) NOT NULL,
`country` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`product_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`title` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`currency` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`price` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`duration` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `feed_id` (`feed_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
Результаты из таблицы:
Пример подачиArray
(
[id] => 1
[feed_id] => 1
[country] => xpath('./additional/field[@name="country"]')
[product_id] => productID
[title] => name
[currency] => price['currency']
[price] => price
[duration] => xpath('./additional/field[@name="duration"]')
)
XML:
<?xml version="1.0" encoding="iso-8859-1"?>
<products>
<product>
<productID>32934</productID>
<name>Cruise Antillen en Zuid-Amerika & strand Curaçao</name>
<price currency="EUR">1405.00</price>
<extra>
<field name="country">Panama</field>
<field name="duration">12</field>
</extra>
</product>
..
etc.
..
</products>
Мой вопрос: как я могу заставить эту функцию работать на всех каналах? Имейте в виду, что в других источниках prod_id или тег страны названы совершенно разными.
Я не могу понять это, боролся с этим в течение нескольких дней и не мог найти ответы на этом форуме.
Предложения для альтернатив eval() также приветствуются!
Просьба быть в ваших ответах, так как я новичок в php.
даже если есть стена текста я до сих пор не получить то, что вы хотите – Soundz