如何按设定的时间间隔重新解析XML文档?

时间:2013-04-20 00:18:58

标签: php javascript jquery xml ajax

我在客户的网站上构建了一个区域,显示当前播放的歌曲,通过PHP从XML文件解析。但是,我的客户希望歌曲自动刷新,而不是他必须手动刷新页面。

我使用jQuery.get()和.ajax()来解析文件,但由于XML文件的结构方式,似乎我只能将艺术家和名称压缩成一个字符串,或者当我尝试具体时它只返回[object Object]。

我甚至没有尝试过计算歌曲的长度,然后根据该长度刷新Feed。我可能没有看到,因为这对我来说显然是个问题。

非常感谢任何帮助或一般指导。

使用PHP代码的示例(显然,非AJAX):

<?php
    $recentlyPlayed = simplexml_load_file('http://publicapi.streamtheworld.com/public/nowplaying?mountName=ABCDFM&numberToFetch=1&eventType=track');
    $trackTitle = $recentlyPlayed->{'nowplaying-info'}[0]->property[1];
    $trackArtist = $recentlyPlayed->{'nowplaying-info'}[0]->property[0];
    echo "<h6>" . $trackArtist . "<span class=\"song-title\">" . $trackTitle . "</span></h6>";
?>

我尝试了几种不同的方法来实现这一点,但似乎最初的障碍是尝试使用属性而不是节点名来引用XML文件中的数据。节点的名称都相同,它们是区分它们的属性。因此,这样的代码将正确呈现,除非艺术家/歌曲标题为空白,然后它呈现第三个字段,其类型为加密命名为“cue_time_start”。

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>
<script type="text/javascript">
    $(document).ready(function() {
        setInterval("songPull()",1000);
    });

    function songPull() {
        $.get(
            "http://publicapi.streamtheworld.com/public/nowplaying?mountName=ABCDFM&numberToFetch=1&eventType=track", 
            "xml",
            function(data) {
                $(data).find("nowplaying-info").each(function(){
                    var artist = $(this).find("property").eq(0).text();
                    var title = $(this).find("property").eq(1).text();
                    $('body').html("<h1>" + artist + "<small class=\"song-title\">" + title + "</small></h1>");
                    console.log (artist);
                    console.log (title);
                });
            }
        );
    }
</script>
<body>

</body>

在尝试做这类事情时,任何有关最佳实践的指导,建议或示例都会非常感激。

1 个答案:

答案 0 :(得分:1)

我不确定这是否是你想要的,但你可以简单地使用属性选择器从XML文档中提取你想要的数据。

http://jsfiddle.net/P8dc6/

$.get("http://publicapi.streamtheworld.com/public/nowplaying?mountName=KROXFM&numberToFetch=1&eventType=track", 
    "xml",
    function(data) {
        var $nowPlaying = $(data).find('nowplaying-info');
        console.log($nowPlaying.find('[name=track_artist_name]').text());
        console.log($nowPlaying.find('[name=cue_title]').text());
    }
);

此外,永远不要将string传递给setIntervalsetTimeout,您只需直接传递函数参考:

setInterval(songPull ,1000);