按 ID 过滤 XML 个文件

Filtering XML file by ID

您好,我在尝试解析 XML 文件时遇到问题

我正在尝试使用 id 仅显示一首歌曲内容

mysongs.php?id=0 它应该显示 "I left my heart on Europa" 歌曲

如果mysongs.php?id=1

它应该显示 "Oh Ganymede" 歌曲

我想使用 ID 而不是歌曲编号 我的问题是当我使用 [$id] 而不是数字 [0] 时不起作用

echo $mysongs->song[$id]->title;

请问我该如何解决我的问题

这是我的XML文件内容songs.xml

<album>
    <song dateplayed="2011-07-24 19:40:26">
        <title>I left my heart on Europa</title>
        <artist>Ship of Nomads</artist>
    </song>
    <song dateplayed="2011-07-24 19:27:42">
        <title>Oh Ganymede</title>
        <artist>Beefachanga</artist>
    </song>
  </album>

我的PHP代码如下

<?php
$id = $_GET['id'];
$mysongs = simplexml_load_file('songs.xml');
echo $mysongs->song[0]->title;
?>

这可能是类型问题。

尝试回显你的 id 类型,除非你在某个地方解析它,否则它将是一个字符串:

<?php
$id = $_GET['id'];
echo gettype($id);

然后,当您执行 $mysongs->song[$id] 时,它不是 $mysongs->song[0] 的等价物,而是 $mysongs->song['0'] 的等价物,这不是同一个索引。

因此,要获得预期的输出,您应该在将其用作索引之前将其转换为 int。为此,您可以使用强制转换 ($id = (int) $_GET['id'];),或者如果它在您的 PHP 版本中不可用 intval ($id = intval($_GET['id']);

那么最后的结果应该是……

<?php
$id = (int) $_GET['id'];
$mysongs = simplexml_load_file('songs.xml');
echo $mysongs->song[$id]->title;

您需要将 id 设置为 xml 文件中列参数的一部分

尝试下面的代码

<album>
    <song dateplayed="2011-07-24 19:40:26">
         <id>1</id>
        <title>I left my heart on Europa</title>
        <artist>Ship of Nomads</artist>
    </song>
    <song dateplayed="2011-07-24 19:27:42">
        <id>2</id>
        <title>Oh Ganymede</title>
        <artist>Beefachanga</artist>
    </song>
  </album>

您可以使用以下两种方法获取结果

1.) 使用直接元素法

下面的例子获取“.xml”文件中第一个和第二个元素中的and元素的节点值:

<?php
$id = $_GET['id'];
$mysongs = simplexml_load_file('songs.xml')or die("Error: Cannot create object");
//get the first record
echo $mysongs->song[0]->id;
echo $mysongs->song[0]->title;

//get the second record
echo $mysongs->song[1]->id;
echo $mysongs->song[1]->title;
?>

2.) 使用元素循环法

 <?php
$mysongs=simplexml_load_file("songs.xml") or die("Error: Cannot create object");
foreach($mysongs->children() as $song_album) {
    echo $song_album->id . ", ";
    echo $song_album->title . ", ";
    echo $song_album->artist . "<br>";
}
?>