Я искал какое-то время на этом и не имел большой удачи. Я нашел много ресурсов, показывающих, как эхо-данные от динамического XML, но я новичок в PHP, и ничто из того, что я написал, похоже, захватывает и печатает именно то, что я хочу, хотя из всего, что я слышал, он должен быть относительно легким. Исходный 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
, но я не могу понять, как это сделать, чтобы напечатать то, что находится между этими информационными скобками.
Простите, если я ничего не вытащил. Я не только новичок в PHP, но и новичок в StackOverflow. Я ссылался на этот сайт в других проектах, и это всегда было невероятно полезно, поэтому заблаговременно за ваше терпение и помощь!
//////// Законченный рабочий сценарий – благодаря Стефано и всем, кто помогал!
<?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>"; ?>
Вместо использования цикла for
вы можете получить тот же результат с XPath :
// Extraction splitted across two lines for clarity $artist_xpath = $sxe->xpath('//info[@name="artist"]'); $artist = (string) $artist_xpath[0]; echo $artist;
Вам нужно будет отрегулировать выражение xpath (т. @name=...
Изменить @name=...
соответственно), но вы получите эту идею. Также обратите внимание, что [0]
необходимо, потому что xpath
возвращает массив совпадений (и вам нужен только первый), а (string)
используется для извлечения текста, содержащегося в узле.
Кроме того, ваш XML недействителен и будет отклонен синтаксическим анализатором из-за букв &
появления в <info name="album">
.
Если вы снова посмотрите на свой код, вам не будет функция, которая превращает первый результат выражения xpath в строку элемента SimpleXMLElement (casting).
Один из способов написать это один раз – это расширение от 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 возможно что-то подобное, и это, вероятно, то, что вы ищете в конце: