2011-05-27 104 views
0

首先,我是否可以指出我是PHP的所有人員的新人,所以如果此處有任何不清楚的地方,我會表示歉意,恐怕越是外行人,反應越好。我一直在解析一個xml文件到php中,然後爲我的網站填充一個HTML表格。目前,我已經能夠獲得完整的XML feed到一個字符串,然後我可以回顯和查看,一切似乎都很好。然後我認爲我可以使用simplexml來挑選特定元素並打印它們的內容,但一直無法做到這一點。使用PHP解析XML(simplexml)

xml提要將不斷變化(結構保持不變)並且採用壓縮格式。從各種來源,我已經確定了以下命令,以便在字符串中使用正確格式的Feed,儘管我仍然無法打印特定元素。我嘗試了所有組合,沒有任何運氣,並懷疑我可能會咆哮錯誤的樹。有人能請我指出正確的方向嗎?!

$file = fopen("compress.zlib://$url", 'r'); 
$xmlstr = file_get_contents($url); 
$xml = new SimpleXMLElement($url,null,true); 

foreach($xml as $name) { 
    echo "{$name->awCat}\r\n"; 
} 

許多,許多在此先感謝,

克里斯

PS The actual feed

+1

戈登,謝謝,我只是想現在要做到這一點,而無需創建串......我只是選擇了awCat作爲例如,我實際上會使用其他元素:) – Chris 2011-05-27 11:42:04

回答

2

既然沒有人跟着我的closevote,我想我可以把我自己的意見作爲一個答案:

首先,SimpleXml可以直接加載URI,它可以通過流封裝來實現,所以你在開始時的三個調用可以縮短爲(注意你是不使用$file在所有)

$merchantProductFeed = new SimpleXMLElement("compress.zlib://$url", null, TRUE); 

爲了讓你能值或者使用隱式的SimpleXML API,並深入到想要的元素(如在網站上顯示的其他地方多次):

foreach ($merchantProductFeed->merchant->prod as $prod) { 
    echo $prod->cat->awCat , PHP_EOL; 
} 

或者您可以使用XPath查詢來獲取想直接元素

$xml = new SimpleXMLElement("compress.zlib://$url", null, TRUE); 
foreach ($xml->xpath('/merchantProductFeed/merchant/prod/cat/awCat') as $awCat) { 
    echo $awCat, PHP_EOL; 
} 

Live Demo

要注意,從源XML獲取所有$awCat元素是相當沒有意義,但因爲他們都有「瘦身豐胸&健身」的價值。當然你也可以混合使用XPath和implict API,只需獲取prod元素,然後深入到它們的各個子節點。

使用XPath應該比迭代SimpleXmlElement對象圖要快一些。雖然應該注意的是,這種差異是在一個可以忽略的區域(讀數爲0.000x和0.000y)。不過,如果你打算做更多的XML工作,它會讓你熟悉XPath,因爲它非常強大。把它看作XML的SQL。

有關其他的例子見

+1

Gordon,感謝您的出色總結。 awCat示例就像我發現的子元素一樣使用。意識到他們都是一樣的,我會用其他元素生成表格。我會爲你提到的Xpath選項,再次感謝...克里斯 – Chris 2011-05-27 11:55:11

0

使用print_r($xml)看到解析的XML Feed的結構。

然後,它變得很明顯你將如何遍歷它:

foreach ($xml->merchant->prod as $prod) { 
    print $prod->pId; 
    print $prod->text->name; 
    print $prod->cat->awCat; # <-- which is what you wanted 
    print $prod->price->buynow; 
} 
+0

非常感謝馬里奧,上面的答案直接起作用,並且不妥協不能將你們兩個都標記爲解決方案! Chris – Chris 2011-05-27 11:16:41

1

嘗試......

$url = "http://datafeed.api.productserve.com/datafeed/download/apikey/58bc4442611e03a13eca07d83607f851/cid/97,98,142,144,146,129,595,539,147,149,613,626,135,163,168,159,169,161,167,170,137,171,548,174,183,178,179,175,172,623,139,614,189,194,141,205,198,206,203,208,199,204,201,61,62,72,73,71,74,75,76,77,78,79,63,80,82,64,83,84,85,65,86,87,88,90,89,91,67,92,94,33,54,53,57,58,52,603,60,56,66,128,130,133,212,207,209,210,211,68,69,213,216,217,218,219,220,221,223,70,224,225,226,227,228,229,4,5,10,11,537,13,19,15,14,18,6,551,20,21,22,23,24,25,26,7,30,29,32,619,34,8,35,618,40,38,42,43,9,45,46,651,47,49,50,634,230,231,538,235,550,240,239,241,556,245,244,242,521,576,575,577,579,281,283,554,285,555,303,304,286,282,287,288,173,193,637,639,640,642,643,644,641,650,177,379,648,181,645,384,387,646,598,611,391,393,647,395,631,602,570,600,405,187,411,412,413,414,415,416,649,418,419,420,99,100,101,107,110,111,113,114,115,116,118,121,122,127,581,624,123,594,125,421,604,599,422,530,434,532,428,474,475,476,477,423,608,437,438,440,441,442,444,446,447,607,424,451,448,453,449,452,450,425,455,457,459,460,456,458,426,616,463,464,465,466,467,427,625,597,473,469,617,470,429,430,615,483,484,485,487,488,529,596,431,432,489,490,361,633,362,366,367,368,371,369,363,372,373,374,377,375,536,535,364,378,380,381,365,383,385,386,390,392,394,396,397,399,402,404,406,407,540,542,544,546,547,246,558,247,252,559,255,248,256,265,259,632,260,261,262,557,249,266,267,268,269,612,251,277,250,272,270,271,273,561,560,347,348,354,350,352,349,355,356,357,358,359,360,586,590,592,588,591,589,328,629,330,338,493,635,495,507,563,564,567,569,568/mid/2891/columns/merchant_id,merchant_name,aw_product_id,merchant_product_id,product_name,description,category_id,category_name,merchant_category,aw_deep_link,aw_image_url,search_price,delivery_cost,merchant_deep_link,merchant_image_url/format/xml/compression/gzip/"; 
$zd = gzopen($url, "r"); 
$data = gzread($zd, 1000000); 
gzclose($zd); 

if ($data !== false) { 
    $xml = simplexml_load_string($data); 
    foreach ($xml->merchant->prod as $pr) {   
     echo $pr->cat->awCat . "<br>"; 
    } 
} 
+0

太棒了,你看起來很容易 - 第一次工作,非常感謝! Chris – Chris 2011-05-27 11:15:52

+0

@Gordon有趣的答案+1 – fire 2011-05-27 11:43:59

0
$url = 'you url here'; 
$f = gzopen ($url, 'r'); 
$xml = new SimpleXMLElement (fread ($f, 1000000)); 

foreach($xml->xpath ('//prod') as $name) 
{ 
    echo (string) $name->cat->awCatId, "\r\n"; 
} 
+0

雖然在這種特殊情況下可能沒有太大的區別,但使用直接路徑到需要的元素,例如'/ merchantProductFeed/merchant/prod/cat/awCat'而不是'// prod'應該稍微快一些,因爲XPath不必到處搜索。 – Gordon 2011-05-27 11:31:17

1
<?php 

    $xmlstr = file_get_contents("compress.zlib://$url"); 
    $xml = simplexml_load_string($xmlstr); 

    // you can transverse the xml tree however you want 
    foreach ($xml->merchant->prod as $line) {   
     // $line->cat->awCat -> you can use this 
    } 

更多信息here

+1

或者像@Gordon用'$ xml = new SimpleXMLElement(「compress.zlib:// $ url」,null,TRUE)說的那樣'' – Highstrike 2011-05-27 11:18:38