我正在使用Yandex API创建元搜索引擎。 Yandex以XML格式给出结果。因此,我们需要遍历XML响应,以获取URL,标题,描述等不同的字段。
Yandex的XML响应如下: http://pastebin.com/kAVAVri9
这就是我实施的方式:paste
$dom5 = new DOMDocument();
if ($dom5->loadXML($site_results)) {
$results = $dom5->getElementsByTagName("response");
$results1 = $results->getElementsByTagName("results");
$results2 = $results1->getElementsByTagName("group");
$totals["yandex"] = 1000;
foreach ($results1 as $link) {
$url = $link->getElementsByTagName("doc")->item(2)->nodeValue;
;
$url = str_replace('http://', '', $url);
if (substr($url, -1, 1) == '/') {
$url = substr($url, 0, strlen($url) - 1);
}
$search_results[$i]["url"] = $url;
$title = $link->getElementsByTagName("doc")->item(4)->nodeValue;
$search_results[$i]["title"] = $title;
$test = $link->getElementsByTagName("doc");
$test1 = $test->getElementsByTagName("title");
$desc = $test1->getElementsByTagName("headline")->item(0)->nodeValue;
$search_results[$i]["desc"] = $desc;
$search_results[$i]["engine"] = 'yandex';
$search_results[$i]["position"] = $i + 1;
$i++;
}
}
我是php的新手。如果我犯了一些愚蠢的错误,请原谅我。我无法通过实施来检索结果。请帮我找出错误并从xml响应中获取必要的字段。 谢谢!
答案 0 :(得分:3)
方法getElementsByTagName()
会返回DOMNodeList
:
$results = $dom5->getElementsByTagName("response");
DOMNodeList
不 有一个名为getElementsByTagName()
的方法,但您可以调用它:
$results1 = $results->getElementsByTagName("results");
因此会触发致命错误:每当在PHP中对不存在的对象执行方法时,您将收到致命错误并且脚本停止工作。
不要调用未定义的对象方法,你应该没问题。
除了这些基础知识之外,为了解析这样的XML文档,我通常建议使用SimpleXML,但是这个XML文件有点特殊,我建议从SimpleXML扩展并添加你可能需要使用的功能,部分来自正则表达式来自DOMDocument。
解析这些XML文件时应该了解的一个概念是Xpath。例如,要访问上面遇到许多问题的元素,您可以按字面意思编写路径:
/*/response/results/grouping/group
在使用SimpleXML的PHP中,这看起来像:
$url = 'http://pastebin.com/raw.php?i=kAVAVri9';
$xml = simplexml_load_file($url, 'MySimpleXML');
foreach ($xml->xpath('/*/response/results/grouping/group') as $link) {
# ... operate on $link
}
一个更大的例子:
$url = 'http://pastebin.com/raw.php?i=kAVAVri9';
$url = '../data/yandex.xml';
$xml = simplexml_load_file($url, 'MySimpleXML');
foreach ($xml->xpath('/*/response/results/grouping/group') as $link) {
$url = $link->doc->url->str()->preg('~^https?://(.*?)/*$~u', '$1');
$title = $link->doc->title->text();
$headline = $link->doc->headline->text();
printf("<%s> %s\n%s\n\n", $url, $title, wordwrap($headline));
}
这是示范性的输出:
<www.facebook.com> " Facebook" - a social networking service
Allows users to find and communicate with friends, classmates and
colleagues, share thoughts, photos and videos, and join various groups.
<en.wikipedia.org/wiki/Facebook> Facebook - Wikipedia, the free encyclopedia
Facebook is a social networking service launched in February 2004, owned
and operated by Facebook, Inc. As of September 2012, Facebook has over one
billion active users, more than half of them using Facebook on a mobile
device.
<mashable.com/category/facebook> Facebook
...
上面的PHP代码示例需要更多代码才能工作,因为它从SimpleXML扩展到易于使用。这是通过以下代码完成的:
class MySimpleXML extends SimpleXMLElement
{
public function text()
{
$string = null === $this[0] ? ''
: (dom_import_simplexml($this)->textContent);
return $this->str($string)->normlaizeWS();
}
public function str($string = null)
{
return new MyString($string ?: $this);
}
}
class MyString
{
private $string;
public function __construct($string)
{
$this->string = $string;
}
public function preg($pattern, $replacement)
{
return new self(preg_replace($pattern, $replacement, $this));
}
public function normlaizeWS()
{
return $this->preg('~\s+~', ' ');
}
public function __toString()
{
return (string) $this->string;
}
}
这一开始可能有点多,请查看SimpleXML的PHP手册以及代码示例中使用的其他函数。