2013-10-05 11 views
1

다음 XML 문서에서 제목과 설명을 구문 분석하려고 시도했습니다. 네임 스페이스를 다루는 것에 대한 많은 정보를 찾았지만 네임 스페이스가있는 다른 이름의 자식 인 네임 스페이스를 사용하는 무언가의 내용을 가져 오는 상황을 처리하는 방법을 알아낼 수 없습니다. 어떤 도움이 굉장 할 것입니다!PHP에서 XML 구문 분석의 두 가지 수준의 네임 스페이스

<OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"> 
<responseDate>2013-10-04T23:19:36Z</responseDate> 
<request verb="ListRecords">https://digital.grinnell.edu/drupal/oai2</request> 
<ListRecords> 
<record> 
<header> 
<identifier>oai:digital.grinnell.edu:grinnell_166</identifier> 
<datestamp>2013-07-02T20:59:30Z</datestamp> 
</header> 
<metadata> 
<oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd"> 
<dc:title xmlns:dc="http://purl.org/dc/elements/1.1/"> 
Grinnell College Young Innovator for Social Justice Prize Award Ceremony, 2011 
</dc:title> 
<dc:title xmlns:dc="http://purl.org/dc/elements/1.1/"> 
Young Innovator for Social Justice Prize Award Ceremony, 2011 
</dc:title> 
<dc:type xmlns:dc="http://purl.org/dc/elements/1.1/">Video</dc:type> 
<dc:description xmlns:dc="http://purl.org/dc/elements/1.1/"> 
An edited recording of the award ceremony for the first Grinnell College Young Innovator for Social Justice Prize. 
</dc:description> 

나는이 사용할 노력 해왔다 코드 : 기본적으로 내가 뭘하려고 봤는데 중첩 된 foreach는 루프를 사용하여의 아이들 [ 'oai_dc']의 자식을 얻을 수있다.

<?php 
$feed = file_get_contents("https://digital.grinnell.edu/drupal/oai2?verb=ListRecords&metadataPrefix=oai_dc&from=2013-06-28&set=islandora_genericCollection"); 
$xml = new SimpleXmlElement($feed); 
foreach ($xml->ListRecords->record as $entry){ 
    echo $entry->header->identifier; 
    echo "<br>"; 
    echo $entry->header->datestamp; 
    echo "<br>"; 
    //Use that namespace 

    $dc = $entry->children($namespaces['oai_dc']); 
    foreach ($dc as $dcElement){ 
    $childern = $dcElement->children($namespaces['dc'])->title; 
    echo $children; 
    echo "inner loop"; 
    echo $children->title; 
    echo "<br>"; 
    echo $dcElement->description; 


    } 
} 

>

다음 샘플 출력됩니다

(다시 위의 XML 인 경우에만 전체 XML이 너무 긴 부분) :

OAI : digital.grinnell.edu : grinnell_166 2013- 07-02T20 : 59 : 30Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3268 2013-07-02T23 : 16 : 17Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_209 2013-07-01T16 : 36 : 55Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3269 2013-07-05T23 : 16 : 18Z 내부 루프 내부 루프 OAI : digital.grinnell .EDU : grinnell_3246 2013-07-17T19 : 21 : 41Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3326 2013-07-18T13 : 22 : 46Z 내부 루프 내부 루프 OAI 디지털 .grinnell.edu : grinnell_3249 2013-07-18T13 : 30 : 02Z 내부 루프 내부 루프OAI: digital.grinnell.edu : grinnell_3324 2013-07-18T13 : 31 : 01Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3327 2013-07-18T23 : 16 : 01Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3328 2013-07-18T23 : 16 : 02Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3329 2013-07-18T23 : 16 : 02Z 내주 루프 내부 루프 oai : digital.grinnell.edu : grinnell_3300 2013-08-07T19 : 28 : 45Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3256 2013-08-07T19 : 32 : 07Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3276 2013-08-07T19 : 39 : 05Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3279 2013-08-07T19 : 42 : 51Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3281 2013-08-07T19 : 44 : 55Z 내부 루프 내부 루프 oai : digital.grinnell.듀 : grinnell_3293 2013-08-07T19 : 47 : 21Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3277 2013-08-07T19 : 50 : 29Z 내부 루프 내부 루프 OAI 디지털. grinnell.edu:grinnell_3257 2013-08-07T19 : 52 : 32Z 내부 루프 내부 루프 OAI : digital.grinnell.edu : grinnell_3289 2013-08-07T19 : 54 : 31Z 내부 루프 내부 루프

미리 감사드립니다!

답변

0

고유 한 네임 스페이스 접두사를 등록하십시오. 문서에 사용 된 네임 스페이스 접두사 (및 자동 등록)에 의존하지 마십시오.

$dom = new DOMDocument(); 
$dom->load('https://digital.grinnell.edu/drupal/oai2?verb=ListRecords&metadataPrefix=oai_dc&from=2013-06-28&set=islandora_genericCollection'); 
$xpath = new DOMXpath($dom); 

$xpath->registerNamespace('oai', 'http://www.openarchives.org/OAI/2.0/'); 
$xpath->registerNamespace('oai-dc', 'http://www.openarchives.org/OAI/2.0/oai_dc/'); 
$xpath->registerNamespace('dc', 'http://purl.org/dc/elements/1.1/'); 

$records = $xpath->evaluate('/oai:OAI-PMH/oai:ListRecords/oai:record', NULL, FALSE); 
foreach ($records as $entry) { 
    echo $xpath->evaluate('string(oai:header/oai:identifier)', $entry, FALSE); 
    echo "<br>"; 
    echo $xpath->evaluate('string(oai:header/oai:datestamp)', $entry, FALSE); 
    echo "<br>"; 

    $dc = $xpath->evaluate('oai:metadata/oai-dc:dc/dc:*', $entry, FALSE); 
    foreach ($dc as $dcElement){ 
    switch ($dcElement->localName) { 
    case 'title' : 
     echo 'Title: '.$dcElement->nodeValue; 
     echo "<br>"; 
     break; 
    case 'description' : 
     echo 'Description: '.$dcElement->nodeValue; 
     echo "<br>"; 
     break; 
    } 
    } 
}