2013-07-22 2 views
0

Мне нужно загрузить тонну 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 &amp; 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.

+0

даже если есть стена текста я до сих пор не получить то, что вы хотите – Soundz

ответ

0

Зачем вам нужен eval()? Если вы храните выражения xpath, которые извлекают значения, необходимые для каждого фида, вам просто нужно получить это выражение и передать его в систему DOM, например.

База данных:

feeds (id, url) 
feed_xpath (id, feed_id, value_being_fetched, xpath_expression) 

Потяните вверх конкретный канал, например, http://example.com/feed.xml, затем подтяните связанный с ним XPATH материал:

$dom = new DOMDocument(); 
$dom->loadHTML($feed_url); 
$xpath = new DOMXPath($dom); 

$values = array(); 
foreach($feeds as $feed) { // $feeds being selected from the feeds_xpath table 
    $nodelist = $xpath->query($feed['xpath']) 
    foreach($nodelist as $node) { 
     $array[$feed['value_being_fetched']] = $node->nodeValue; 
    } 
} 
+0

Спасибо @Marc B. Я получил ваш код работает, но он возвращает только 1 строку результатов из-за $ array [$ feed ['value_being_fetched']]. Как изменить массив $, чтобы отсортировать все результаты с помощью уникального идентификатора (например, productID из xml-файла)? –