2017-04-18 16 views
1

我有以下格式的xml文件。如何用Php讀取XML文件數據?

<?xml version="1.0" encoding="utf-8" ?> 
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"> 
    <channel> 
    <title>Data feed Title</title> 
    <link>http://www.amarchitrakatha.com/in/</link> 
    <description>Data feed description.</description> 
    <item>ACKKALID0577 
    <g:id><![CDATA[ACKKALID0577]]></g:id> 
    <title><![CDATA[Kalidasa]]></title> 
    <link><![CDATA[http://www.amarchitrakatha.com/in/kalidasa?fee=19&fep=1147]]></link> 
    <g:price>70.00</g:price> 
    <g:sale_price></g:sale_price> 
    <description><![CDATA[Kalidas Owes His Fame To His Sanksrit Play Abhijnana-Shakuntala (Shakuntala Recognised By The Token Ring), The Long Epic Poem Kumara-Sambhava (Birth Of Kumara) And The Lyric Poem Meghaduta (Cloud Messenger). Kalidasa, Who Lived Some Time In The Middle Of The 4Th And Early 5Th Centuries A.D., Has Left No Account Of His Life. According To Popular Legend, He Owed His Ingenuity As Much To Goddess Kali’S Blessings As To His Own Talents.]]></description> 
    <g:product_type><![CDATA[Amar Chitra Katha > Visionaries > Singles]]></g:product_type> 
    <g:google_product_category><![CDATA[]]></g:google_product_category> 
    <g:image_link><![CDATA[http://www.amarchitrakatha.com/media/catalog/product/K/A/KALIDASA_0__5.jpg]]></g:image_link> 
    <g:condition>new</g:condition> 
    <g:availability>in stock</g:availability> 
    <g:shipping_weight>0.09 kg</g:shipping_weight> 
    <g:brand><![CDATA[]]></g:brand> 
    <g:mpn><![CDATA[ACKKALID0577]]></g:mpn> 
    <g:gtin><![CDATA[]]></g:gtin> 
    </item> 
    <item>ACKPRITH1413 
    <g:id><![CDATA[ACKPRITH1413]]></g:id> 
    <title><![CDATA[Prithviraj Chauhan]]></title> 
    <link><![CDATA[http://www.amarchitrakatha.com/in/prithviraj-chauhan?fee=19&fep=1150]]></link> 
    <g:price>70.00</g:price> 
    <g:sale_price></g:sale_price> 
    <description><![CDATA[Jaichand Was Furious! His Daughter Samyogita Had Eloped With Prithviraj Chauhan, The Warrior King Of Delhi. She, Like Many Others, Was Smitten By Tales Of His Daring, His Nobility And His Sense Of Honour. Though The Young Couple’S Happiness Was Doomed, Even In His Dying Hour, It Was The Brave Prithviraj Who Chose How His Life Should End.]]></description> 
    <g:product_type><![CDATA[Amar Chitra Katha > Brave Hearts Story > Singles]]></g:product_type> 
    <g:google_product_category><![CDATA[]]></g:google_product_category> 
    <g:image_link><![CDATA[http://www.amarchitrakatha.com/media/catalog/product/P/R/PRITHVIRAJ_CHAUHAN_0__4.jpg]]></g:image_link> 
    <g:condition>new</g:condition> 
    <g:availability>in stock</g:availability> 
    <g:shipping_weight>0.09 kg</g:shipping_weight> 
    <g:brand><![CDATA[]]></g:brand> 
    <g:mpn><![CDATA[ACKPRITH1413]]></g:mpn> 
    <g:gtin><![CDATA[]]></g:gtin> 
    </item> 
</channel> 
</rss> 

通過使用simplexml_load_file我沒有收到項目的數據。如何用PHP解析這種格式的XML?我想喜歡G的所有項目的數據:ID,標題,鏈接等

if (file_exists('Sample.xml')) { 
$xml = simplexml_load_file('Sample.xml'); 
echo '<pre>'; 
print_r($xml->channel); 
echo '</pre>'; 
} else { 
exit('Failed to open Sample.xml.'); 
} 

和M得到的結果

SimpleXMLElement Object 
(
[title] => Data feed Title 
[link] => http://www.amarchitrakatha.com/in/ 
[description] => Data feed description. 
[item] => Array 
    (
     [0] => ACKKALID0577 

     [1] => ACKPRITH1413 
    ) 
) 

我必須存儲在特定變量的數據項。

+0

什麼是您的PHP版本? – kolunar

+1

你已經包含了你的XML,但不包括你想用來導入它的代碼。你能否包括你的代碼,以及更精確的結果描述? 「沒有獲得項目的數據」可能是許多事情中的任何一個。檢查你的錯誤日誌,包括任何可疑[在你的問題](http:// stackoverflow。COM /職位/ 43464051 /編輯)。當你處於這個狀態時,你可能想要包含一個更完整的描述你想要對結果做什麼;最好的方向通常是通過了解你的目的地來確定的。 :) – ghoti

+0

我編輯了代碼。 – Magecode

回答

0

我相信這個XML風格,你可以使用標準的PHP的XML解析器(即http://ca2.php.net/manual/en/class.simplexmlelement.php) 加載到您的變量(即$ XML) 然後閱讀這些節點就像這樣:

$xml=simplexml_load_string($yourXMLFile) 
$xml->children('g', true)->id; 

(中上面會拉所有的實例< g:id >)

未測試我的結局。

0

您可以使用PHPDOMDocument來完成它。正如我在下面的代碼中所做的那樣。

Try this code snippet here

<?php 
ini_set('display_errors', 1); 
$object= new DOMDocument(); 
$object->loadXML('<?xml version="1.0" encoding="utf-8" ?> 
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0"> 
    <channel> 
    <title>Data feed Title</title> 
    <link>http://www.amarchitrakatha.com/in/</link> 
    <description>Data feed description.</description> 
    <item>ACKKALID0577 
    <g:id><![CDATA[ACKKALID0577]]></g:id> 
    <title><![CDATA[Kalidasa]]></title> 
    <link><![CDATA[http://www.amarchitrakatha.com/in/kalidasa?fee=19&fep=1147]]></link> 
    <g:price>70.00</g:price> 
    <g:sale_price></g:sale_price> 
    <description><![CDATA[Kalidas Owes His Fame To His Sanksrit Play Abhijnana-Shakuntala (Shakuntala Recognised By The Token Ring), The Long Epic Poem Kumara-Sambhava (Birth Of Kumara) And The Lyric Poem Meghaduta (Cloud Messenger). Kalidasa, Who Lived Some Time In The Middle Of The 4Th And Early 5Th Centuries A.D., Has Left No Account Of His Life. According To Popular Legend, He Owed His Ingenuity As Much To Goddess Kali’S Blessings As To His Own Talents.]]></description> 
    <g:product_type><![CDATA[Amar Chitra Katha > Visionaries > Singles]]></g:product_type> 
    <g:google_product_category><![CDATA[]]></g:google_product_category> 
    <g:image_link><![CDATA[http://www.amarchitrakatha.com/media/catalog/product/K/A/KALIDASA_0__5.jpg]]></g:image_link> 
    <g:condition>new</g:condition> 
    <g:availability>in stock</g:availability> 
    <g:shipping_weight>0.09 kg</g:shipping_weight> 
    <g:brand><![CDATA[]]></g:brand> 
    <g:mpn><![CDATA[ACKKALID0577]]></g:mpn> 
    <g:gtin><![CDATA[]]></g:gtin> 
    </item> 
    <item>ACKPRITH1413 
    <g:id><![CDATA[ACKPRITH1413]]></g:id> 
    <title><![CDATA[Prithviraj Chauhan]]></title> 
    <link><![CDATA[http://www.amarchitrakatha.com/in/prithviraj-chauhan?fee=19&fep=1150]]></link> 
    <g:price>70.00</g:price> 
    <g:sale_price></g:sale_price> 
    <description><![CDATA[Jaichand Was Furious! His Daughter Samyogita Had Eloped With Prithviraj Chauhan, The Warrior King Of Delhi. She, Like Many Others, Was Smitten By Tales Of His Daring, His Nobility And His Sense Of Honour. Though The Young Couple’S Happiness Was Doomed, Even In His Dying Hour, It Was The Brave Prithviraj Who Chose How His Life Should End.]]></description> 
    <g:product_type><![CDATA[Amar Chitra Katha > Brave Hearts Story > Singles]]></g:product_type> 
    <g:google_product_category><![CDATA[]]></g:google_product_category> 
    <g:image_link><![CDATA[http://www.amarchitrakatha.com/media/catalog/product/P/R/PRITHVIRAJ_CHAUHAN_0__4.jpg]]></g:image_link> 
    <g:condition>new</g:condition> 
    <g:availability>in stock</g:availability> 
    <g:shipping_weight>0.09 kg</g:shipping_weight> 
    <g:brand><![CDATA[]]></g:brand> 
    <g:mpn><![CDATA[ACKPRITH1413]]></g:mpn> 
    <g:gtin><![CDATA[]]></g:gtin> 
    </item> 
</channel> 
</rss>'); 
$tagValues=array("g:id","title","link"); 
$result=array(); 
foreach($object->getElementsByTagName("item") as $item) 
{ 
    foreach($item->childNodes as $node) 
    { 
     if($node instanceof DOMElement) 
     { 
      if(in_array($node->tagName,$tagValues)) 
      { 
       $result[$node->tagName][]=$node->textContent; 
      } 
     } 
    } 
} 
print_r($result); 
+0

它給出了結果,但我必須將數據存儲在特定變量中。 – Magecode

+0

@Cvince好的沒有問題我正在更新我的文章,在幾秒鐘內 –

+0

@Cvince現在檢查我的帖子,看看'嘗試這段代碼片段'你可以在那裏檢查,你也可以使用'extract'。 –

0

試試這個,測試了!

$xml = simplexml_load_file('http://example.com/rss.xml'); 
$namespaces = $xml->getNamespaces(true); 
var_dump($namespaces); 

輸出:

array(1) { 
    ["g"]=> string(29) "http://base.google.com/ns/1.0" 
} 

然後:

foreach ($xml->channel->item as $item) 
{ 
    // for php >= 5.2.0 
    // $id = (string) $item->children('g', TRUE)->id; 
    // for php < 5.2.0 
    // $id = (string) $item->children('http://base.google.com/ns/1.0')->id; 
    $id = (string) $item->children($namespaces["g"])->id; // for php < 5.2.0 
    $title = (string) $item->title; 
    $link = (string) $item->link; 
    var_dump($id, $title, $link); 
    echo "--\n"; 
} 

輸出:

string(12) "ACKKALID0577" 
string(8) "Kalidasa" 
string(58) "http://www.amarchitrakatha.com/in/kalidasa?fee=19&fep=1147" 
-- 
string(12) "ACKPRITH1413" 
string(18) "Prithviraj Chauhan" 
string(68) "http://www.amarchitrakatha.com/in/prithviraj-chauhan?fee=19&fep=1150" 
-- 

最後,對於例如以將結果結合對象的數組:

$xml = simplexml_load_file('http://example.com/rss.xml'); 
$namespaces = $xml->getNamespaces(true); 
$itemArray = array(); 
foreach ($xml->channel->item as $item) 
{ 
    $obj = new stdClass(); 
    $obj->id = (string) $item->children($namespaces["g"])->id; // for php < 5.2.0 
    $obj->title = (string) $item->title; 
    $obj->link = (string) $item->link; 
    $itemArray[] = $obj; 
} 
var_dump($itemArray); 

輸出:

array(2) { 
    [0]=> object(stdClass)#5 (3) { 
     ["id"]=> string(12) "ACKKALID0577" 
     ["title"]=> string(8) "Kalidasa" 
     ["link"]=> string(58) "http://www.amarchitrakatha.com/in/kalidasa?fee=19&fep=1147" 
    } 
    [1]=> object(stdClass)#3 (3) { 
     ["id"]=> string(12) "ACKPRITH1413" 
     ["title"]=> string(18) "Prithviraj Chauhan" 
     ["link"]=> string(68) "http://www.amarchitrakatha.com/in/prithviraj-chauhan?fee=19&fep=1150" 
    } 
} 

價:http://php.net/manual/en/simplexmlelement.getnamespaces.php

價:http://php.net/manual/en/simplexmlelement.children.php

價:http://www.sitepoint.com/forums/showthread.php?606057-...

0

你可以得到g中的值:使用此屬性

$handle_object = $element->children('g', true);