2016-09-28 3 views
0

У меня есть XML-файл output.xmlЧтение XML-данных в PHP

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <item> 
    <key type="your_id">CYBEX-525A/DA-IPOD</key> 
    <key type="web">cybex-525at-arc-trainer</key> 
    <key type="web">standard-console-2573</key> 
    <key type="name">Cybex 525AT Arc Trainer</key> 
    <key type="name">Standard console</key> 
    <review> 
     <order_id>1544346 1</order_id> 
     <author_nick>Brock</author_nick> 
     <author_email>[email protected]</author_email> 
     <date type="accepted">2013-10-14</date> 
     <comment type="overall">This cardio machine is exceptional. It works every part of your leg muscles if you rotate through the height settings and include calf-raises and squats during your routine. It also works your shoulders and biceps if you focus on working them while operating the arm poles. Unlike a standard elliptical it will raise your heart rate and cause you to sweat heavily soon after you start your routine. If you're a runner and are used to using a treadmill, you will feel satisfied after using this machine. It is kind of addictive because your body feels so good during and after use. I have combined 30 minutes on the treadmill with 30 minutes on the Arc for weight-loss, muscle tone, and cardiovascular training.</comment> 
     <score type="overall">5</score> 
    </review> 
    </item> 
</items> 

Мне нужно, чтобы сохранить его в БД, я только с помощью кода ниже, чтобы сохранить данные

if(file_exists('output.xml')){ 
    $languages = simplexml_load_file("output.xml"); 
    //echo '<pre>'; print_r($languages) ; die; 
    foreach($languages as $item){ 
      echo '<pre>'; print_r($item->key) ; die; 
      foreach($item->review as $review){ 
       $order_id = $review[0]->order_id; 
       $authorName = $review[0]->author_nick; 
       $authorEmail = strtolower($review[0]->author_email); 
       $comment  = $review[0]->comment; 
       $score  = $review[0]->score; 
       $date  = $review[0]->date; 

     } 
    } 
} 

мне нужно чтобы получить значение <key type="your_id">CYBEX-525A/DA-IPOD</key> и <key type="web">cybex-525at-arc-trainer</key>, но не смог получить данные , когда я печатать echo '<pre>'; print_r($item->key) ; die; в цикле я получаю следующее из пут:

SimpleXMLElement Object 
(
    [@attributes] => Array 
     (
      [type] => your_id 
     ) 

    [0] => CYBEX-525A/DA-IPOD 
    [1] => cybex-525at-arc-trainer 
    [2] => standard-console-2573 
    [3] => Cybex 525AT Arc Trainer 
    [4] => Standard console 
) 

Есть ли способ получить все эти данные.

+0

Почему вы звоните 'die' до достижения второго цикла? [die doc] (http://php.net/manual/en/function.die.php) – Ayak973

+0

Поскольку мне нужен CYBEX-525A/DA-IPOD данные перед вторым контуром – Arunendra

ответ

1

DOMXpath::evaluate() позволяет использовать выражение для извлечения узлов и скалярные значения из XML DOM. Выражение определяет, является ли результатом список узлов или скалярное значение. Вы можете перебирать список узлов с помощью foreach().

$document = new DOMDocument(); 
$document->loadXml($xmlString); 
$xpath = new DOMXPath($document); 

foreach ($xpath->evaluate('/items/item') as $item) { 
    var_dump(
    [ 
     'id' => $xpath->evaluate('string(key[@type="your_id"])', $item) 
    ] 
); 
    foreach ($xpath->evaluate('review', $item) as $review) { 
    var_dump(
     [ 
     'nick' => $xpath->evaluate('string(author_nick)', $review), 
     'email' => $xpath->evaluate('string(author_email)', $review) 
     ] 
    ); 
    } 
} 

Выход:

array(1) { 
    ["id"]=> 
    string(18) "CYBEX-525A/DA-IPOD" 
} 
array(2) { 
    ["nick"]=> 
    string(5) "Brock" 
    ["email"]=> 
    string(12) "[email protected]" 
} 

Второй аргумент или DOMXpath::evaluate() является контекстом для выражения. Таким образом, легко перебирать список узлов и извлекать данные для них.

Xpath выполняет функции, такие как string() регистр первого узла списка в скалярное значение. Если список пуст, и будет возвращено пустое значение типа.

SimpleXML позволяет извлекать массивы узлов с использованием SimpleXMLElement::xpath(). Здесь нет прямого способа получения скалярных значений, но реализованные магические методы допускают компактный синтаксис.

Вам нужно будет отобразить возвращаемые объекты SimpleXMLElement в строки.

$items = new SimpleXMLElement($xmlString); 

foreach ($items->xpath('item') as $item) { 
    var_dump(
    [ 
     'id' => (string)$item->xpath('key[@type="your_id"]')[0] 
    ] 
); 
    foreach ($item->xpath('review') as $review) { 
    var_dump(
     [ 
     'nick' => (string)$review->author_nick, 
     'email' => (string)$review->author_email 
     ] 
    ); 
    } 
} 
0

Вы можете использовать в качестве примера

$xml="".$rs_rssfeed['rss_url'].""; 
 
\t \t $xmlDoc = new DOMDocument(); 
 
\t \t $xmlDoc->load($xml); 
 
\t \t 
 
\t \t $xpath = new DOMXPath($xmlDoc); 
 
\t \t 
 
\t \t $count = $xpath->evaluate('count(//item)'); 
 

 
    if($count>0) 
 
\t \t { 
 
\t \t \t 
 
\t \t \t 
 
\t \t \t $x=$xmlDoc->getElementsByTagName('item'); 
 
\t \t \t for ($i=0; $i<$count =  $xpath->evaluate('count(//item)'); $i++) 
 
    \t \t \t { 
 
\t 
 
\t \t \t \t $item_title=$x->item($i)->getElementsByTagName('title')->item(0)->nodeValue; 
 
\t \t \t \t $item_link=$x->item($i)->getElementsByTagName('link')->item(0)->nodeValue; 
 
\t \t \t \t $item_desc=$x->item($i)->getElementsByTagName('description')->item(0)->nodeValue; 
 
\t \t \t \t $item_pubdate=$x->item($i)->getElementsByTagName('pubDate')->item(0)->nodeValue; 
 
} 
 
}

+0

И для ... данные, как их получить? – Arunendra

+0

следующим образом: $ xmlDoc = новый DOMDocument(); $ XmlDoc-> нагрузка ($ XML); Пожалуйста, измените в соответствии с вашими потребностями – madankundu

+0

снова Мне нужно это, чтобы объявить внутри цикла? пожалуйста, просмотрите мой код в сообщении, есть более одного обзора в моем файле – Arunendra

1

Если вы не будете использовать DOMDocument, вы можете попробовать:

foreach($languages->item as $item){    //loop through item(s) 
    foreach($item->key as $key) {      //loop through key(s) 
     if ($key["type"] == "your_id") echo $key;  //echo CYBEX-525A/DA-IPOD 
    } 

    print_r($item->review);       //prints review data 
}