很抱歉问这个,但这让我发疯。 我一直在使用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";
}
答案 0 :(得分:3)
您的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];
歌曲艺术家
您的第二种方法:
$sxml->nowplaying_info[0]->property['@name']['track_artist_name'];
将尝试访问第一个属性元素的名为@name
的属性,而不是将其视为xpath样式的@
表达式。要在不使用xpath的情况下执行此操作,您需要遍历每个<property>
元素,并测试其名称服装。
答案 1 :(得分:0)
如果您要查找的节点深深地位于某个位置,则只需在开始处添加双斜杠即可。
$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']");