2017-02-13 10 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> 

: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時にはその印刷物:インストラクターは、私の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 ; 
} 

EDITです時にはそれは警告をスローする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

():投げ警告ノードは、もはや何のメインの '$ NAME' – parvez

+0

に沿って存在します()?あなたの完全なコードとエラーを表示してください。あなたの与えられたコードに基づいて、ソリューションは正常に動作します。試運転リンクを見てください。 –

+0

編集されたバージョンを確認してください – parvez

関連する問題