XML:在php中显示两个具有相同名称的子节点

时间:2022-08-11 16:52:22

I have a problem with showing my xml into a php page. I have an xml that looks like this (obviously its only a part of it because it really to long to post it all). It all goes well until it cames to the "genre", I have two values for it and I don't know how to show them at the same time.

我有一个问题,将我的xml显示到php页面。我有一个看起来像这样的xml(显然它只是它的一部分因为它真的很长才能发布它)。一切顺利,直到它出现“流派”,我有两个值,我不知道如何同时显示它们。

<movie>
     <id>4441</id>
     <title>Rudderless</title>
     <title_long>Rudderless (2014)</title_long>
     <year>2014</year>
     <rating>7.5</rating>
     <runtime>105</runtime>
<genres>
   <genre>Comedy</genre>
   <genre>Drama</genre>
</genres>
</movie>

(an important thing to notice is that not every movie will have two genre, sometimes there is only one and sometime two or three) This is my code right now

(需要注意的一点是,并非每部电影都有两种类型,有时只有一种,有时只有两种或三种)这是我现在的代码

$genere = array();
foreach ($xml->data->movies->movie->genres as $row) {
    foreach ($row->children() as $key => $val) {
        if ($key == "genre") {
            $genere[] = $val;
        }
    }
}
//and then I'll print
for ($i = 0; $i < 20 ; $i++) {
    echo "<div class=text><b>" . $genere[$i] . "</b></div>";
}

When I'm doing this it will print only for the first item of the array, and the others just give me a "Notice: Undefined offset: 1 in /path/ on line 53"

当我这样做时,它将只打印数组的第一项,其他人只给我一个“通知:未定义的偏移量:1 / in / path / on line 53”

I've tried to follow some guides but it was a failure

我试图按照一些指南,但这是一个失败

What am I doing wrong?

我究竟做错了什么?

/--Edit--/

<?php

 $xml = simplexml_load_file("https://yts.to/api/v2/list_movies.xml")
 $titolo = array();
$locandina = array();
    $anno = array();
    $durata = array();
    $genere = array();

    foreach ($xml->data->movies->movie as $element) 
    {
        foreach($element->children() as $key => $val) 
        {
            $chiave = $key;
            $valore = $val;
            if ($key == "title")
            {
                $titolo[] = $val ;
            }   
            if ($key == "medium_cover_image")
            {
                $locandina[] = $val ;
            }   
            if ($key == "year")
            {
                $anno[] = $val ;
            }   
            if ($key == "runtime")
            {
                $durata[] = $val;
            }
        }
    }
foreach ($xml->data->movies->movie->genres as $row) 
    {
        foreach($row->children() as $key => $val) 
        {
            if ($key == "genre")
            {
                $genere[] = $val;
            }
        }
    }
    var_dump($genere);

    for ($i=0 ; $i<20 ; $i++)
    {
        echo "<div class=totbox>";
        echo "<div class=box><img src=" . $locandina[$i] . "></div>";
        echo "<div class=text><b>" . $titolo[$i] . "</b> - " . $anno[$i] . "</div>";
        echo "<div class=text><b>" . $genere[$i] . "</b></div>";
        echo "<div class=text><b> Durata:" . $durata[$i] . "</b></div>";
        echo "</div>";
    }
?>

2 个解决方案

#1


0  

UPDATED - Code fixed. Please, try now.

更新 - 代码已修复。请试试吧。

<?php
$xml = simplexml_load_file("https://yts.to/api/v2/list_movies.xml")
$titolo = array();
$locandina = array();
$anno = array();
$durata = array();
$genere = array();

    $i = 0;
    foreach ($xml->data->movies->movie as $element) {
        foreach ($element->children() as $key => $val) {
            $chiave = $key;
            $valore = $val;
            if ($key == "title") {
                $titolo[] = $val;
            }
            if ($key == "medium_cover_image") {
                $locandina[] = $val;
            }
            if ($key == "year") {
                $anno[] = $val;
            }
            if ($key == "runtime") {
                $durata[] = $val;
            }
            if ($key == "genres") {

                for($g = 0; $g < count($xml->data->movies->movie[$i]->genres->genre); $g++) {
                        $genere[$i][] = $xml->data->movies->movie[$i]->genres->genre[$g];
                }
            }
        }
        $i++;
    }



    for ($i = 0; $i < count($titolo); $i++) {
        echo "<div class=totbox>";
        if (isset($locandina[$i])) {
            echo "<div class=box><img src=" . $locandina[$i] . "></div>";
        }
        echo "<div class=text><b>" . $titolo[$i] . "</b> - " . $anno[$i] . "</div>";
        foreach ($genere[$i] as $genResult) {
            echo "<div class=text><b>" . $genResult . "</b></div>";
        }

        echo "<div class=text><b> Durata:" . $durata[$i] . "</b></div>";
        echo "</div>";
    }

I hope this helps!

我希望这有帮助!

#2


0  

Look on my code, based on yours. PHP file:

根据你的代码查看我的代码。 PHP文件:

<?php
$xml = new SimpleXMLElement(file_get_contents('test.xml'));
$genere = array();
foreach ($xml->genres as $row) {
    foreach ($row->children() as $key => $val) {
        if ($key == "genre") {
            $genere[] = $val;
        }
    }
}
//and then I'll print
foreach ($genere as $genre) {
    echo "<div class=text><b>" . $genre . "</b></div>";
}

XML file:

<movie>
     <id>4441</id>
     <title>Rudderless</title>
     <title_long>Rudderless (2014)</title_long>
     <year>2014</year>
     <rating>7.5</rating>
     <runtime>105</runtime>
<genres>
   <genre>Comedy</genre>
   <genre>Drama</genre>
</genres>
</movie>

Its work fine, test it.

它的工作正常,测试它。

Based on your full xml file, look on this:

根据您的完整xml文件,请查看以下内容:

<genres>
<genre>Horror</genre>
</genres>

You have only one genre on first position, so its work fine. You need to loop on movie tag first, not genres. So put your genre tag inside movie foreach.

你在第一个位置只有一种类型,所以它的工作正常。你需要首先循环电影标签,而不是流派。所以把你的类型标签放在电影foreach中。

Like:

    foreach($element->children() as $key => $val) 
    {
        if ($key == "genres")
        {
            // your loop, based on $val variable!
        }   

#1


0  

UPDATED - Code fixed. Please, try now.

更新 - 代码已修复。请试试吧。

<?php
$xml = simplexml_load_file("https://yts.to/api/v2/list_movies.xml")
$titolo = array();
$locandina = array();
$anno = array();
$durata = array();
$genere = array();

    $i = 0;
    foreach ($xml->data->movies->movie as $element) {
        foreach ($element->children() as $key => $val) {
            $chiave = $key;
            $valore = $val;
            if ($key == "title") {
                $titolo[] = $val;
            }
            if ($key == "medium_cover_image") {
                $locandina[] = $val;
            }
            if ($key == "year") {
                $anno[] = $val;
            }
            if ($key == "runtime") {
                $durata[] = $val;
            }
            if ($key == "genres") {

                for($g = 0; $g < count($xml->data->movies->movie[$i]->genres->genre); $g++) {
                        $genere[$i][] = $xml->data->movies->movie[$i]->genres->genre[$g];
                }
            }
        }
        $i++;
    }



    for ($i = 0; $i < count($titolo); $i++) {
        echo "<div class=totbox>";
        if (isset($locandina[$i])) {
            echo "<div class=box><img src=" . $locandina[$i] . "></div>";
        }
        echo "<div class=text><b>" . $titolo[$i] . "</b> - " . $anno[$i] . "</div>";
        foreach ($genere[$i] as $genResult) {
            echo "<div class=text><b>" . $genResult . "</b></div>";
        }

        echo "<div class=text><b> Durata:" . $durata[$i] . "</b></div>";
        echo "</div>";
    }

I hope this helps!

我希望这有帮助!

#2


0  

Look on my code, based on yours. PHP file:

根据你的代码查看我的代码。 PHP文件:

<?php
$xml = new SimpleXMLElement(file_get_contents('test.xml'));
$genere = array();
foreach ($xml->genres as $row) {
    foreach ($row->children() as $key => $val) {
        if ($key == "genre") {
            $genere[] = $val;
        }
    }
}
//and then I'll print
foreach ($genere as $genre) {
    echo "<div class=text><b>" . $genre . "</b></div>";
}

XML file:

<movie>
     <id>4441</id>
     <title>Rudderless</title>
     <title_long>Rudderless (2014)</title_long>
     <year>2014</year>
     <rating>7.5</rating>
     <runtime>105</runtime>
<genres>
   <genre>Comedy</genre>
   <genre>Drama</genre>
</genres>
</movie>

Its work fine, test it.

它的工作正常,测试它。

Based on your full xml file, look on this:

根据您的完整xml文件,请查看以下内容:

<genres>
<genre>Horror</genre>
</genres>

You have only one genre on first position, so its work fine. You need to loop on movie tag first, not genres. So put your genre tag inside movie foreach.

你在第一个位置只有一种类型,所以它的工作正常。你需要首先循环电影标签,而不是流派。所以把你的类型标签放在电影foreach中。

Like:

    foreach($element->children() as $key => $val) 
    {
        if ($key == "genres")
        {
            // your loop, based on $val variable!
        }