0

大量の XML フィードを読み込み、情報をデータベースに保存する必要があります。XML フィールドを制御することはできませんが、通常、一意の ID、タイトル、通貨、価格、期間が含まれています。

以下のコードは、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('./extra/field[@name="country"]') などをデータベースに保存して、eval() を使用してさまざまなフィード フィールドの値を簡単に取得できるようにすることを考えていました。私は eval() が悪であることを知っており、より良い提案を受け入れています。この種のデータを扱っているのは私だけなので、 eval() の危険性は通常よりも多少小さいかもしれません。

product_id と title の取得は正常に機能します。問題は国と期間にあり、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の初心者なので、答えを明確にしてください。

4

1 に答える 1

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;
    }
}
于 2013-07-22T19:37:27.940 に答える