Я постоянно сталкивался с проблемой разбора XML с PHP и не нашел «правильный путь» или, по крайней мере, стандартизованный способ анализа XML-файлов.
Во-первых, я пытаюсь разобрать это:
<item> <title>2884400</title> <description><![CDATA[ ><img width="126" alt="" src="http://img.ruphp.com/php/27319921.jpg" /> ]]></description> <link>http://www.last.fm/music/+noredirect/Beatles/+images/27319921</link> <author>anne710</author> <pubDate>Tue, 21 Apr 2009 16:12:31 +0000</pubDate> <guid>http://www.last.fm/music/+noredirect/Beatles/+images/27319921</guid> <media:content url="http://img.ruphp.com/php/Beatles+2884400.jpg" fileSize="13065" type="image/jpeg" expression="full" width="126" height="126" /> <media:thumbnail url="http://img.ruphp.com/php/27319921.jpg" type="image/jpeg" width="126" height="126" /> </item>
Я использую этот код:
$doc = new DOMDocument(); $doc->load('http://ws.audioscrobbler.com/2.0/artist/beatles/images.rss'); $arrFeeds = array(); foreach ($doc->getElementsByTagName('item') as $node) { $itemRSS = array ( 'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue ); array_push($arrFeeds, $itemRSS); }
Теперь я хочу получить атрибуты url «media: content» и «media: thumbnail», как бы я это сделал? Теперь я думаю, что я должен использовать DOMElement :: getAttribute, но мне не удалось заставить его работать: / Может кто-нибудь пролить свет на это, а также сообщить мне, если это хороший способ разобрать XML?
С уважением, Шади
Вы можете использовать SimpleXML, как предложено другими плакатами, но вам нужно использовать функции children () и attributes (), чтобы вы могли иметь дело с разными пространствами имен
Пример (непроверенный):
$feed = file_get_contents('http://ws.audioscrobbler.com/2.0/artist/beatles/images.rss'); $xml = new SimpleXMLElement($feed); foreach ($xml->channel->item as $item) { foreach ($item->children('http://search.yahoo.com/mrss' as $media_element) { var_dump($media_element); } }
Кроме того, вы можете использовать XPath (опять же, непроверенный):
$feed = file_get_contents('http://ws.audioscrobbler.com/2.0/artist/beatles/images.rss'); $xml = new SimpleXMLElement($feed); $xml->registerXPathNamespace('media', 'http://ws.audioscrobbler.com/2.0/artist/beatles/images.rss'); $images = $xml->xpath('/rss/channel/item/media:content@url'); var_dump($images);
Так я в конечном итоге сделал это с помощью XMLReader:
<?php define ('XMLFILE', 'http://ws.audioscrobbler.com/2.0/artist/vasco%20rossi/images.rss'); echo "<pre>"; $items = array (); $i = 0; $xmlReader = new XMLReader(); $xmlReader->open(XMLFILE, null, LIBXML_NOBLANKS); $isParserActive = false; $simpleNodeTypes = array ("title", "description", "media:title", "link", "author", "pubDate", "guid"); while ($xmlReader->read ()) { $nodeType = $xmlReader->nodeType; // Only deal with Beginning/Ending Tags if ($nodeType != XMLReader::ELEMENT && $nodeType != XMLReader::END_ELEMENT) { continue; } else if ($xmlReader->name == "item") { if (($nodeType == XMLReader::END_ELEMENT) && $isParserActive) { $i++; } $isParserActive = ($nodeType != XMLReader::END_ELEMENT); } if (!$isParserActive || $nodeType == XMLReader::END_ELEMENT) { continue; } $name = $xmlReader->name; if (in_array ($name, $simpleNodeTypes)) { // Skip to the text node $xmlReader->read (); $items[$i][$name] = $xmlReader->value; } else if ($name == "media:thumbnail") { $items[$i]['media:thumbnail'] = array ( "url" => $xmlReader->getAttribute("url"), "width" => $xmlReader->getAttribute("width"), "height" => $xmlReader->getAttribute("height"), "type" => $xmlReader->getAttribute("type") ); } else if ($name == "media:content") { $items[$i]['media:content'] = array ( "url" => $xmlReader->getAttribute("url"), "width" => $xmlReader->getAttribute("width"), "height" => $xmlReader->getAttribute("height"), "filesize" => $xmlReader->getAttribute("fileSize"), "expression" => $xmlReader->getAttribute("expression") ); } } print_r($items); echo "</pre>"; ?>
Попробуй это. Все будет хорошо.
$doc = new DOMDocument(); $doc->load('http://ws.audioscrobbler.com/2.0/artist/beatles/images.rss'); $arrFeeds = array(); foreach ($doc->getElementsByTagName('item') as $node) { $itemRSS = array ( 'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue, 'thumbnail' => $node->getElementsByTagName('thumbnail')->item(0)->getAttribute('url') ); array_push($arrFeeds, $itemRSS); }
<?php #Convert the String Into XML $xml = new SimpleXMLElement($_POST['name']); #Itterate through the XML for the data $values = "VALUES('' , "; foreach($xml->item as $item) { //you now have access to that aitem } ?>
Попробуйте использовать SimpleXML: http://us2.php.net/simplexml
Вы хотели бы что-то вроде этого:
'content' => $node->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'content')->item(0)->getAttribute('url'); 'thumbnail' => $node->getElementsByTagNameNS('http://search.yahoo.com/mrss/', 'thumbnail')->item(0)->getAttribute('url');
Я считаю, что это сработает, прошло некоторое время, так как я сделал что-то подобное.
Вы можете получить сообщение об ошибке для Call to a member function getAttribute() on a non-object
если в корме отсутствуют записи, такие как thumbnail
, поэтому, когда мне нравится ответ @Helder Robalo, вы должны проверить, чтобы убедиться, что узел существует, прежде чем пытаться использовать такие вещи, как getAttribute()
:
<?php header('Content-type: text/plain; charset=utf-8'); $doc = new DOMDocument(); $doc->load('http://ws.audioscrobbler.com/2.0/artist/beatles/images.rss'); $arrFeeds = array(); foreach ($doc->getElementsByTagName('item') as $node) { $itemRSS = array ( 'title' => $node->getElementsByTagName('title')->item(0)->nodeValue, 'desc' => $node->getElementsByTagName('description')->item(0)->nodeValue, 'link' => $node->getElementsByTagName('link')->item(0)->nodeValue, 'date' => $node->getElementsByTagName('pubDate')->item(0)->nodeValue ); if( sizeof($node->getElementsByTagName('thumbnail')->item(0)) > 0 ) { $itemRSS['thumbnail'] = $node->getElementsByTagName('thumbnail')->item(0)->getAttribute('url'); } else { $itemRSS['thumbnail'] = ''; } array_push($arrFeeds, $itemRSS); } print_r($arrFeeds);
Медиа: атрибуты контента на самом деле довольно легко получить с SIMPLE XML
if(!@$x=simplexml_load_file($feed_url)){ } else { foreach($x->channel->item as $entry) { $media = $entry->children('http://search.yahoo.com/mrss/')->attributes(); $url = (string) $media['url']; } }