2011-05-27 166 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