2017-02-13 79 views
0

這裏是我試圖解析一段時間的XML,但是我被困在嵌套的元素上。使用php解析嵌套的xml

<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:course="https://www.example.org/api/course/elements/1.0/" xmlns:staff="https://www.example.org/api/staff/elements/1.0/" version="2.0"> 
<channel> 
<item> 
<title>example.org course feed</title> 
<link>https://www.example.org/api/v2/report/course-feed/rss</link> 
<description>.org - course catalog feed</description> 
<language>en</language> 
<course:instructors> 
    <course:staff> 
    <staff:name>Mark Moran</staff:name> 
    </course:staff> 
</course:instructors> 
</item> 
</channel> 

如何解析課程:教師,我的PHP代碼是

$rss = simplexml_load_file('https://www.edx.org/api/v2/report/course-feed/rss'); 
$namespaces = $rss->getNamespaces(true); 
foreach ($rss->channel->item as $item) { 
$title = $item->title ; 
} 

編輯:2

$rss = simplexml_load_file('https://www.example.org/api/v2/report/course-feed/rss'); 
$namespaces = $rss->getNamespaces(true);//Add this line 
foreach ($rss->channel->item as $item) { 
$course_title = $item->title ; 
$course_description = $item->description; 
$course_url = $item->link; 
$course = $item->children($namespaces['course']); 
$course_thumbnail_url = $course->{'image-thumbnail'}; 
$course_banner_url = $course->{'image-banner'}; 
$course_teaser_url = $course->{'video-youtube'}; 
$course_start_date = $course->start; 
$course_duration = $course->length; 
$instructors = $item->children('course',true)->instructors; 
$staff = $instructors->children('course',true)->staff; 
$instructor_name = $staff->children('staff',true)->name; 
$instructor_image = $staff->children('staff',true)->image; 
echo $instructor_name.' '.$instructor_image,"<br>"; 
$course_price = 0; 
$course_provider_id = 3; 
$course_affiliates = $course->school; 
$categories = $course->subject; 
$categories = explode(',', $categories); 
$c = count($categories); 
$i = 0; 
while($i < $c) 
{ 
    $course_rating = mt_rand(3.5,5); 
    $course_category = $categories[$i]; 
    if(mysqli_query($conn,"INSERT into course_catalog_table (course_title,course_description,course_url,course_thumbnail_url,course_banner_url,course_teaser_url,course_category,course_start_date,course_duration,course_rating,course_affiliates,course_instructor,course_instructor_image,course_price,course_provider_id) VALUES('$course_title','$course_description','$course_url','$course_thumbnail_url','course_banner_url','course_teaser_url','$course_category','$course_start_date','$course_duration','$course_rating','$course_affiliates','$instructor_name',$instructor_image','$course_price')")) 
    { 
     echo "successfull\r\n"; 
} 
$i++; 
} 
} 

當我打印instructor_name和instructor_image有時它的打印但有時會引發警告main(): Node no longer exists,我如何檢查是否爲空

回答

0

您可以使用children()函數來訪問xml結構的子樹。

這樣做:

$rss->channel->item->children('course',true)->instructors; 

閱讀:http://php.net/manual/en/simplexmlelement.children.php

但由於XML有多個鳥巢,您需要使用多個children()功能訪問最深的巢。

下面是修改代碼來解析你給的XML:

foreach ($rss->channel->item as $item) 
{ 
    $title = $item->title; 

    // access course:instructors nest 
    $instructors = $item->children('course',true)->instructors; 

    // then access the course:staff nest 
    $staff = $instructors->children('course',true)->staff; 

    // finally access the staff:name nest value 
    $name = $staff->children('staff',true)->name; 

    // print the value 
    echo "Staff Name: ". $name . "<br>"; 
} 

試運行:https://eval.in/735810

+0

的main():投擲警告節點不再行存在與'$ name' – parvez

+0

主要是什麼()?請顯示您的完整代碼和錯誤。因爲根據您提供的代碼,解決方案正常工作。看看測試運行鏈接。 –

+0

檢查編輯版本 – parvez