2012-04-26 33 views
3

我想使用SimpleXML解析此文件:http://mdc.cbuc.cat/cgi-bin/oai.exe?verb=ListRecords&metadataPrefix=oai_dc&set=afcecemc&from=2011-06-21&until=2011-06-21php - 使用SimpleXML來解析OAI PMH文件

我可以得到所有元素,但那些在標籤內。它說標籤是空的。這是我的代碼。

function getXMLfile($URL) { 
    $chDyn = curl_init(); 
    curl_setopt ($chDyn, CURLOPT_URL, $URL); 
    curl_setopt($chDyn, CURLOPT_RETURNTRANSFER, 1); 
    $xml = curl_exec($chDyn); 
    curl_close($chDyn); 

    try { 
     $xmlObj = new SimpleXMLElement($xml); 
    } 
    catch (Exception $e) { echo $e; } 

    return $xmlObj; 
} 


$cdmURL = "http://mdc.cbuc.cat/cgi-bin/oai.exe?verb=ListRecords&metadataPrefix=oai_dc&set=afcecemc"; 

$xmlObj = getXMLfile($cdmURL); 
$xmlNode = $xmlObj->ListRecords; 

foreach ($xmlNode->record as $rNode) { 
    var_dump($rNode->children()); 
} 

但產量是這個:

[...] 
["metadata"]=> 
    object(SimpleXMLElement)#8 (0) { 
} 

這個元素是不是空的!我知道該解決方案與使用「命名空間」有某種關係,但我無法弄清楚如何使其工作。

任何幫助它將不勝感激! 謝謝。

+0

發佈XML字符串。 – MrCode 2012-04-26 07:24:44

回答

3

要使用自己的名稱空間訪問子項,您必須告訴SimpleXMLElement您希望子項不在默認語言中。請參閱SimpleXMLElement::children

您鏈接的文檔使用多個名稱空間,因此如果您不熟悉它,可能會有點混淆。

以下是延伸你的一些示例代碼(簡化裝載了一點,但我想你明白吧)訪問的第一個記錄元件(Ⅰ打破循環)內的兒童:

$url = 'http://mdc.cbuc.cat/cgi-bin/oai.exe?verb=ListRecords&metadataPrefix=oai_dc&set=afcecemc&from=2011-06-21&until=2011-06-21'; 

$xmlObj = simplexml_load_file($url); 

$xmlNode = $xmlObj->ListRecords; 

foreach ($xmlNode->record as $rNode) { 
    var_dump($rNode->children()); 
    var_dump($rNode->metadata->children('oai_dc', 1)); 
    var_dump($rNode->metadata->children('oai_dc', 1)->dc->children('dc', 1)); 
    break; 
} 

這給出了以下輸出,我猜是你在找什麼:

object(SimpleXMLElement)#7 (2) { 
    ["header"]=> 
    object(SimpleXMLElement)#9 (3) { 
    ["identifier"]=> 
    string(29) "oai:mdc.cbuc.cat:afcecemc/521" 
    ["datestamp"]=> 
    string(10) "2011-06-21" 
    ["setSpec"]=> 
    string(8) "afcecemc" 
    } 
    ["metadata"]=> 
    object(SimpleXMLElement)#10 (0) { 
    } 
} 
object(SimpleXMLElement)#10 (1) { 
    ["dc"]=> 
    object(SimpleXMLElement)#8 (0) { 
    } 
} 
object(SimpleXMLElement)#7 (12) { 
    ["title"]=> 
    string(12) "Puig d'Assas" 
    ["creator"]=> 
    string(26) "Gallardo i Garriga, Antoni" 
    ["date"]=> 
    string(19) "[Entre 1912 i 1928]" 
    ["relation"]=> 
    array(2) { 
    [0]=> 
    string(72) "Paper; gelatina i plata; positiu; blanc i negre; horitzontal; 12 x 17 cm" 
    [1]=> 
    string(27) "Estudi de la Masia Catalana" 
    } 
    ["subject"]=> 
    string(9) "Muntanyes" 
    ["coverage"]=> 
    string(32) "Puig d'Assas ; Osona ; Catalunya" 
    ["description"]=> 
    array(2) { 
    [0]=> 
    string(2) "Bo" 
    [1]=> 
    string(163) "Títol atorgat pel catalogador. Informació extreta dels àlbums de l'EMC: Situació: Puig d'Assas. Facilitada per: Antoni Gallardo i Garriga. Facilitada en: 1928." 
    } 
    ["publisher"]=> 
    string(33) "Centre Excursionista de Catalunya" 
    ["source"]=> 
    string(29) "Memòria Digital de Catalunya" 
    ["type"]=> 
    string(5) "Image" 
    ["rights"]=> 
    string(49) "http://creativecommons.org/licenses/by-nc-nd/3.0/" 
    ["identifier"]=> 
    string(35) "http://mdc.cbuc.cat/u?/afcecemc,521" 
} 
+0

謝謝,它工作得很好!快速清晰! – EnPep 2012-04-26 07:54:15

+0

非常棒!完美的工作,我與其他代碼混合: '$ metatemp = $ rNode-> metadata-> children('oai_dc',1) - > dc-> children('dc',1); foreach($ metatemp as $ metadata => $ data){ $ results [$ i] [「metadata」] [$ metadata] =(string)$ data; }' – elporfirio 2015-03-19 00:26:26