2012-04-26 83 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