从命名字段中获取 XML 值

Getting an XML value from a named field

很抱歉问这个问题,但这让我发疯了。 我一直在使用 php SimpleXMLElement 作为我的 XML 去解析器,我已经看过很多例子,并且已经放弃了很多次。但是,现在,我只需要让这个工作。有很多关于如何获取简单字段的示例,但没有那么多字段中的值...

我正在尝试从 XML 中获取 "track_artist_name" 值作为 php 中的命名变量。

<nowplaying-info-list>
  <nowplaying-info >
    <property name="track_title"><![CDATA[Song Title]]></property>
    <property name="track_album_name"><![CDATA[Song Album]]></property>
    <property name="track_artist_name"><![CDATA[Song Artist]]></property>
  </nowplaying-info>
</nowplaying-info-list>

我试过将 xpath 用于:

$sxml->xpath("/nowplaying-info-list[0]/nowplaying-info/property[@name='track_artist_name']"));

但是,我知道这一切都搞砸了,无法正常工作。

我最初也尝试过这样的事情,认为它有道理 - 但没有:

attrs = $sxml->nowplaying_info[0]->property['@name']['track_artist_name'];
echo $attrs . "\n\n";

我知道我可以通过这样的方式获取值:

$sxml->nowplaying_info[0]->property[2];

有时 XML 结果中的行数比其他时候多,因此,它会用错误的数据中断计算。

有人可以阐明我的问题吗?我只是想把艺术家的名字变成一个变量。非常感谢。

*** 工作更新:**

我不知道有不同的 XML 解释器方法,并且使用了以下 XML 解释器版本:

// read feed into SimpleXML object
$sxml = new SimpleXMLElement($json);

那没有用,但现在已经更新到以下内容(对于那部分代码)感谢这里的帮助。

$sxml_new = simplexml_load_string($json_raw);
if ( $sxml_new->xpath("/nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']") != null )
{
    $results = $sxml_new->xpath("/nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");
    //print_r($results);
    $artist = (string) $results[0];
   // var_dump($artist); 
    echo "Artist: " . $artist . "\n";
}

您的 xpath 表达式非常正确,但您不需要为 <nowplaying-info-list> 元素指定索引 - 它会自行处理。如果您要提供索引,it would need to start at 1, not 0.

尝试

$results = $sxml->xpath("/nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");

echo (string) $results[0];

Song Artist

https://3v4l.org/eH4Dr

你的第二种方法:

$sxml->nowplaying_info[0]->property['@name']['track_artist_name'];

将尝试访问第一个 属性 元素的名为 @name 的属性,而不是将其视为 xpath 样式的 @ 表达式。要在不使用 xpath 的情况下执行此操作,您需要遍历每个 <property> 元素,并测试它们的 name 属性。

以防万一你要查找的节点深入某个地方,你可以在开头添加一个双斜杠。

$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");

如果您有多个 <nowplaying-info> 元素,也可以。您可以为此使用索引。 (注意 [1] 索引)

$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info[1]/property[@name='track_artist_name']");