Как анализировать XML в Википедии с помощью PHP? Я попробовал это с помощью простого пива, но ничего не получил. Вот ссылка, которую я хочу получить.
http://en.wikipedia.org/w/api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content&format=xml
Изменить код:
<?php define("EMAIL_ADDRESS", "youlichika@hotmail.com"); $ch = curl_init(); $cv = curl_version(); $user_agent = "curl ${cv['version']} (${cv['host']}) libcurl/${cv['version']} ${cv['ssl_version']} zlib/${cv['libz_version']} <" . EMAIL_ADDRESS . ">"; curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt"); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); curl_setopt($ch, CURLOPT_ENCODING, "deflate, gzip, identity"); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HTTPGET, TRUE); curl_setopt($ch, CURLOPT_URL, "http://en.wikipedia.org/w/api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content&format=xml"); $xml = curl_exec($ch); $xml_reader = new XMLReader(); $xml_reader->xml($xml, "UTF-8"); echo $xml->api->query->pages->page->rev; ?>
Обычно я использую комбинацию XMLReader
и XMLReader
для синтаксического анализа XML, созданного API MediaWiki.
Обратите внимание, что вы должны указать свой адрес электронной почты в заголовке User-Agent
, иначе скрипт API будет отвечать HTTP 403 Forbidden.
Вот как я инициализирую дескриптор CURL:
define("EMAIL_ADDRESS", "my@email.com"); $ch = curl_init(); $cv = curl_version(); $user_agent = "curl ${cv['version']} (${cv['host']}) libcurl/${cv['version']} ${cv['ssl_version']} zlib/${cv['libz_version']} <" . EMAIL_ADDRESS . ">"; curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt"); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); curl_setopt($ch, CURLOPT_ENCODING, "deflate, gzip, identity"); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
Затем вы можете использовать этот код, который захватывает XML и создает новый объект XMLReader
в $xml_reader
:
curl_setopt($ch, CURLOPT_HTTPGET, TRUE); curl_setopt($ch, CURLOPT_URL, "http://en.wikipedia.org/w/api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content&format=xml"); $xml = curl_exec($ch); $xml_reader = new XMLReader(); $xml_reader->xml($xml, "UTF-8");
EDIT: Вот рабочий пример:
<?php define("EMAIL_ADDRESS", "youlichika@hotmail.com"); $ch = curl_init(); $cv = curl_version(); $user_agent = "curl ${cv['version']} (${cv['host']}) libcurl/${cv['version']} ${cv['ssl_version']} zlib/${cv['libz_version']} <" . EMAIL_ADDRESS . ">"; curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt($ch, CURLOPT_COOKIEFILE, "cookies.txt"); curl_setopt($ch, CURLOPT_COOKIEJAR, "cookies.txt"); curl_setopt($ch, CURLOPT_ENCODING, "deflate, gzip, identity"); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HTTPGET, TRUE); curl_setopt($ch, CURLOPT_URL, "http://en.wikipedia.org/w/api.php?action=query&generator=allpages&gaplimit=2&gapfilterredir=nonredirects&gapfrom=Re&prop=revisions&rvprop=content&format=xml"); $xml = curl_exec($ch); $xml_reader = new XMLReader(); $xml_reader->xml($xml, "UTF-8"); function extract_first_rev(XMLReader $xml_reader) { while ($xml_reader->read()) { if ($xml_reader->nodeType == XMLReader::ELEMENT) { if ($xml_reader->name == "rev") { $content = htmlspecialchars_decode($xml_reader->readInnerXML(), ENT_QUOTES); return $content; } } else if ($xml_reader->nodeType == XMLReader::END_ELEMENT) { if ($xml_reader->name == "page") { throw new Exception("Unexpectedly found `</page>`"); } } } throw new Exception("Reached the end of the XML document without finding revision content"); } $latest_rev = array(); while ($xml_reader->read()) { if ($xml_reader->nodeType == XMLReader::ELEMENT) { if ($xml_reader->name == "page") { $latest_rev[$xml_reader->getAttribute("title")] = extract_first_rev($xml_reader); } } } function parse($rev) { global $ch; curl_setopt($ch, CURLOPT_HTTPGET, TRUE); curl_setopt($ch, CURLOPT_URL, "http://en.wikipedia.org/w/api.php?action=parse&text=" . rawurlencode($rev) . "&prop=text&format=xml"); sleep(3); $xml = curl_exec($ch); $xml_reader = new XMLReader(); $xml_reader->xml($xml, "UTF-8"); while ($xml_reader->read()) { if ($xml_reader->nodeType == XMLReader::ELEMENT) { if ($xml_reader->name == "text") { $html = htmlspecialchars_decode($xml_reader->readInnerXML(), ENT_QUOTES); return $html; } } } throw new Exception("Failed to parse"); } foreach ($latest_rev as $title => $latest_rev) { echo parse($latest_rev) . "\n"; }
Вы можете использовать simplexml
:
$xml = simplexml_load_file($url);
См. Пример здесь: http://php.net/manual/en/simplexml.examples-basic.php
Или Dom
:
$xml = new DomDocument; $xml->load($url);
Или XmlReader
для огромных XML-документов, которые вы не хотите читать полностью в памяти.
Вы должны посмотреть на класс php XMLReader .