Php 从命名字段获取XML值

Php 从命名字段获取XML值,php,xml,xpath,simplexml,Php,Xml,Xpath,Simplexml,很抱歉问这个问题,但这让我发疯了。 我一直在使用php SimpleXMLElement作为XML的语法分析器,我看过很多例子,并且多次放弃了这一点。但是,现在,我只需要让它工作。有很多关于如何获取简单字段的示例,但字段中有值的示例并不多 我试图从这个XML中获取“track\u artist\u name”值,作为php中的命名变量 <nowplaying-info-list> <nowplaying-info > <property name="tr

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

我试图从这个XML中获取“track\u artist\u 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>
但是,我知道一切都搞砸了,不起作用

我最初也尝试过类似的方法,认为这是有道理的——但没有:

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表达式非常正确,但是不需要为
元素指定索引,它自己会处理这个问题。如果要提供索引

试一试

歌曲艺术家

你的第二种方法:

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

将尝试访问第一个属性元素的名为
@name
的属性,而不是将其视为xpath样式的
@
表达式。要在不使用xpath的情况下实现这一点,您需要在每个
元素上循环,并测试它们的名称attibrute。

您的xpath表达式非常正确,但不需要为
元素指定索引-它自己会处理这个问题。如果要提供索引

试一试

歌曲艺术家

你的第二种方法:

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

将尝试访问第一个属性元素的名为
@name
的属性,而不是将其视为xpath样式的
@
表达式。要在不使用xpath的情况下实现这一点,您需要在每个
元素上循环,并测试它们的名称

以防您要查找的节点深入某个位置,您可以在开始处添加一个双斜杠

$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");
如果您有多个
元素,也可以使用。你可以利用这个索引。(请注意[1]索引)


以防您正在查找的节点深入某个位置,您可以在开始处添加一个双斜杠

$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info/property[@name='track_artist_name']");
如果您有多个
元素,也可以使用。你可以利用这个索引。(请注意[1]索引)


var\u dump($sxml)?来自
[1]
的Xpath计数,但不是零var\u dump($sxml)?来自
[1]
的Xpath计数,但不是零谢谢。你的例子真的很有帮助。最后我要做的(根据链接的示例)是使用simplexml\u load\u字符串,而不是$sxml=newsimplexmlement($raw\u xml);谢谢你。你的例子真的很有帮助。最后我要做的(根据链接的示例)是使用simplexml\u load\u字符串,而不是$sxml=newsimplexmlement($raw\u xml);
$results = $sxml->xpath("//nowplaying-info-list/nowplaying-info[1]/property[@name='track_artist_name']");