我一直在寻找这个并且没有多少运气。我发现有很多资源显示如何从动态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 & 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: "...
?>
我想我需要使用foreach
和echo
,但我无法弄清楚如何以一种打印之间的之间的方式来实现它/ 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>";
?>
答案 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也可能有类似的东西,这可能是你最终想要的东西: