2017-02-13 4 views
0

Hier ist die XML, die ich für eine Weile zu analysieren versuche, aber ich bin auf verschachtelte Elemente fest.Parsing verschachtelte XML mit PHP

<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> 

wie natürlich analysieren: Lehrer, meine PHP-Code ist

$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: 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++; 
} 
} 

Wenn ich drucken instructor_name und instructor_image manchmal seine Drucke aber manchmal warnt es davor main(): Node no longer exists, wie kann ich überprüfen, dass ist leer oder nicht

Antwort

0

Sie können die children() Funktion verwenden, um auf den untergeordneten Baum der XML-Struktur zuzugreifen.

wie folgt tun:

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

lesen: http://php.net/manual/en/simplexmlelement.children.php

Aber da die XML mehr Nest hat, müssen Sie mehrere children() Funktion verwenden, um das tiefste Nest zuzugreifen.

Hier ist der modifizierte Code die XML Sie geben zu analysieren:

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>"; 
} 

Testlauf: https://eval.in/735810

+0

main(): Werfen Warn Knoten existiert nicht mehr im Einklang mit '$ name' – parvez

+0

Welches Haupt() Bitte zeigen Sie Ihre vollständigen Codes und Fehler. Aufgrund des angegebenen Codes funktioniert die Lösung einwandfrei. Sehen Sie sich den Testlauf-Link an. –

+0

Überprüfen Sie die bearbeitete Version – parvez