用于回显VLC的PHP脚本现在播放XML属性

时间:2013-05-11 14:21:33

标签: php xml vlc

我一直在寻找这个并且没有多少运气。我发现有很多资源显示如何从动态XML中回显数据,但我是PHP新手,我写的任何东西似乎都没有抓住并打印出我想要的东西,尽管我所有的东西都是#&# 39;听说过,应该相对容易。源XML(位于192.168.0.15:8080/requests/status.xml)如下:

<root>
  <fullscreen>0</fullscreen>
  <volume>97</volume>
  <repeat>false</repeat>
  <version>2.0.5 Twoflower</version>
  <random>true</random>
  <audiodelay>0</audiodelay>
  <apiversion>3</apiversion>
  <videoeffects>
  <hue>0</hue>
  <saturation>1</saturation>
  <contrast>1</contrast>
  <brightness>1</brightness>
  <gamma>1</gamma>
  </videoeffects>
  <state>playing</state>
  <loop>true</loop>
  <time>37</time>
  <position>0.22050105035305</position>
  <rate>1</rate>
  <length>168</length>
  <subtitledelay>0</subtitledelay>
  <equalizer/>
  <information>
  <category name="meta">
  <info name="description">
  000003EC 00000253 00000D98 000007C0 00009C57 00004E37 000068EB 00003DC5 00015F90 00011187
  </info>
  <info name="date">2003</info>
  <info name="artwork_url"> file://brentonshp04/music%24/Music/Hackett%2C%20Steve/Guitar%20Noir%20%26%20There%20Are%20Many%20Sides%20to%20the%20Night%20Disc%202/Folder.jpg
  </info>
  <info name="artist">Steve Hackett</info>
  <info name="publisher">Recall</info>
  <info name="album">Guitar Noir &amp; There Are Many Sides to the Night Disc 2
  </info>
  <info name="track_number">5</info>
  <info name="title">Beja Flor [Live]</info>
  <info name="genre">Rock</info>
  <info name="filename">Beja Flor [Live]</info>
  </category>
  <category name="Stream 0">
  <info name="Bitrate">128 kb/s</info>
  <info name="Type">Audio</info>
  <info name="Channels">Stereo</info>
  <info name="Sample rate">44100 Hz</info>
  <info name="Codec">MPEG Audio layer 1/2/3 (mpga)</info>
  </category>
  </information>
  <stats>
  <lostabuffers>0</lostabuffers>
  <readpackets>568</readpackets>
  <lostpictures>0</lostpictures>
  <demuxreadbytes>580544</demuxreadbytes>
  <demuxbitrate>0.015997290611267</demuxbitrate>
  <playedabuffers>0</playedabuffers>
  <demuxcorrupted>0</demuxcorrupted>
  <sendbitrate>0</sendbitrate>
  <sentbytes>0</sentbytes>
  <displayedpictures>0</displayedpictures>
  <demuxreadpackets>0</demuxreadpackets>
  <sentpackets>0</sentpackets>
  <inputbitrate>0.016695899888873</inputbitrate>
  <demuxdiscontinuity>0</demuxdiscontinuity>
  <averagedemuxbitrate>0</averagedemuxbitrate>
  <decodedvideo>0</decodedvideo>
  <averageinputbitrate>0</averageinputbitrate>
  <readbytes>581844</readbytes>
  <decodedaudio>0</decodedaudio>
  </stats>
  </root> 

我想写的是一个简单的PHP脚本,它回应了艺术家的名字(在这个例子中是史蒂夫哈克特)。实际上我喜欢回应艺术家,歌曲和专辑,但我相信,如果我展示了如何找回一个,我可以自己弄清楚其余部分。

我的剧本实际上似乎有什么用处,如下所示。我尝试过的不仅仅是下面的内容,但是我遗漏了一些事实并非正常的事情。

<?PHP
$file = file_get_contents('http://192.168.0.15:8080/requests/status.xml');
$sxe = new SimpleXMLElement($file);

foreach($sxe->...

echo "Artist: "...

?>

我想我需要使用foreachecho,但我无法弄清楚如何以一种打印之间的之间的方式来实现它/ em>那些信息括号。

对不起,如果我遗漏了任何东西。我不仅是PHP的新手,而且我也是StackOverflow的新手。我在其他项目中引用了这个网站,它总是非常有帮助,所以提前感谢您的耐心和帮助!

////////完成的工作脚本 - 感谢Stefano和所有帮助过的人!

<?PHP
$file = file_get_contents('http://192.168.0.15:8080/requests/status.xml');
$sxe = new SimpleXMLElement($file);

$artist_xpath = $sxe->xpath('//info[@name="artist"]');
$album_xpath = $sxe->xpath('//info[@name="album"]');
$title_xpath = $sxe->xpath('//info[@name="title"]');


$artist = (string) $artist_xpath[0];
$album = (string) $album_xpath[0];
$title = (string) $title_xpath[0];


echo "<B>Artist: </B>".$artist."</br>";
echo "<B>Title: </B>".$title."</br>";
echo "<B>Album: </B>".$album."</br>";
?>

2 个答案:

答案 0 :(得分:2)

您可以使用XPath获得相同的结果,而不是使用for循环:

// Extraction splitted across two lines for clarity
$artist_xpath = $sxe->xpath('//info[@name="artist"]');
$artist = (string) $artist_xpath[0];
echo $artist;

你必须调整xpath表达式(即适当地改变@name=...),但你明白了。另请注意[0]是必要的,因为xpath将返回匹配数组(您只需要第一个),而转换(string)用于提取节点中包含的文本。

此外,由于&标记中出现文字<info name="album">,您的XML无效并会被解析程序拒绝。

答案 1 :(得分:1)

如果再次查看代码,则缺少一个将xpath表达式的第一个结果转换为SimpleXMLElement(cast)字符串的函数。

写一次的一种方法是从 SimpleXMLElement 扩展

class BetterXMLElement extends SimpleXMLElement
{
    public function xpathString($expression) {
        list($result) = $this->xpath($expression);
        return (string) $result;
    }
}

然后创建更具体的SimpleXMLElement,就像之前使用较少特定的一样:

$file = file_get_contents('http://192.168.0.15:8080/requests/status.xml');
$sxe  = new BetterXMLElement($file);

然后您将从以下代码中受益:

$artist = $sxe->xpathString('//info[@name="artist"]');
$album  = $sxe->xpathString('//info[@name="album"]');
$title  = $sxe->xpathString('//info[@name="title"]');

echo "<B>Artist: </B>".$artist."</br>";
echo "<B>Title: </B>".$title."</br>";
echo "<B>Album: </B>".$album."</br>";

这使您重复一些代码。这意味着您可以在以下地方减少错误:)

当然,您可以通过允许传递多个xpath查询的数组并返回所有名称的值来进一步优化它。但是,根据您的具体需求,您需要自己编写。因此,使用您在编程中学到的知识可以使编程更容易:)

如果您想要更多建议,下面是使用 DOMDocument 的另一个非常详细的示例, SimpleXML 的姐妹库。这是非常先进的,但可能会给你一些很好的灵感,我认为使用SimpleXML也可能有类似的东西,这可能是你最终想要的东西: