我需要从DBLP
所有元素的描述和所有字段都可以在以下网址找到:
http://dblp.uni-trier.de/xml/dblp.dtd
帮助文件位于:
http://dblp.uni-trier.de/xml/docu/dblpxml.pdf
所以,你有一个API,你按年份做GET请求,你得到一个JSON文档;
我想从今天的文章中获得JSON文档;
但我不知道如何使用mdate
属性生成GET请求;
这是文章的结构:
<article key="journals/cacm/Szalay08"
mdate="2008-11-03">
<author>Alexander S. Szalay</author>
<title>Jim Gray, astronomer.</title>
<pages>58-65</pages>
<year>2008</year>
<volume>51</volume>
<journal>Commun. ACM</journal>
<number>11</number>
<ee>http://doi.acm.org/10.1145/
1400214.1400231</ee>
<url>db/journals/cacm/
cacm51.html#Szalay08</url>
</article>
我尝试了这个http://dblp.uni-trier.de/rec/bibtex/journals/acta/BayerM72
并得到了:
<?xml version="1.0"?>
<dblp>
<article key="journals/acta/BayerM72"
mdate="2003-11-25">
<author>Rudolf Bayer</author>
<author>Edward M. McCreight</author>
<title>Organization and Maintenance
of Large Ordered Indices</title>
...
</article>
</dblp>
我需要使用字段mdate
提取所有最新文章。
这是一篇关于各种请求的文章:http://dblp.uni-trier.de/xml/docu/dblpxmlreq.pdf
php代码:
<pre>
<?php
$url = 'http://dblp.uni-trier.de/rec/bibtex/';
$key = 'journals/acta/BayerM72';
$content = file_get_contents($url . $key);
echo $content;
?>
</pre>
答案 0 :(得分:2)
对于解析xml,有XML Parser,XMLReader和SimpleXML。 XML Parser和XMLReader用于大文件SimpleXML - 用于小文件(&lt; 1Mb)。
function startElement($parser, $tag, $attrs) {
global $articles, $isArticle, $i, $globTag;
$globTag = $tag;
if ($tag == 'article') {
$isArticle = true;
if (isset ( $attrs ['mdate'] )) {
// add date from attribute in article
$articles [$i] ['mdate'] = $attrs ['mdate'];
}
}
}
function endElement($parser, $tag) {
global $articles, $isArticle, $i, $globTag;
if ($tag == 'article') {
$isArticle = false;
++ $i;
}
}
function getElement($parser, $data) {
global $articles, $isArticle, $i, $globTag;
if ($isArticle) {
$articles [$i] = $articles [$i] + [
$globTag => $data
];
}
}
global $articles, $isArticle, $i, $globTag;
$articles = [ ];
$i = 0;
$isArticle = false;
$url = 'http://dblp.uni-trier.de/rec/bibtex/';
$key = 'journals/acta/BayerM72';
$url .= $key;
$parser = xml_parser_create ();
xml_set_element_handler ( $parser, "startElement", "endElement" );
xml_set_character_data_handler ( $parser, 'getElement' );
xml_parser_set_option ( $parser, XML_OPTION_CASE_FOLDING, false );
$file = fopen ( $url, 'rb' );
if ($file === false) {
die ( "File isnt!!" );
}
$clasterSize = 8192;
while ( $data = fread ( $file, $clasterSize ) ) {
if (! xml_parse ( $parser, $data, feof ( $file ) )) {
die ( sprintf ( "XML error: %s at line %d", xml_error_string ( xml_get_error_code ( $parser ) ), xml_get_current_line_number ( $parser ) ) );
}
}
xml_parser_free ( $parser );
fclose ( $file );
这是XML Parser中的示例。
<?php
$url = 'http://dblp.uni-trier.de/rec/bibtex/';
$key = 'journals/acta/BayerM72';
$content = file_get_contents($url . $key);
$xml = new SimpleXMLElement($content);
/* Search for <dblp><article> */
$result = $xml->xpath('/dblp/article');
// $result is an array of SimpleXMLElement objects
var_dump($result);
?>
有SimpleXML示例。您在结果中获得了一个SimpleXMLElement对象数组。查看manual以获取SimpleXMLElement属性SimpleXMLElement->attributes();
。
答案 1 :(得分:1)
如果API没有提供更新的更新方式,您必须缓存文档并从更改中提取文章。
DBLP2RSS,一个从DBLP创建RSS源的项目,使用shell script执行此操作:
#!/bin/sh
id="$1"
name="$2"
cache="$3"
test -d "$cache" || exit 1
curlit() {
in-dcs && curl --proxy wwwcache.dcs.gla.ac.uk:8080 "$@" || curl --proxy "" "$@"
}
prefix="http://dblp.uni-trier.de/rec/bibtex"
echo "<dblp-content name=\"$1\">"
curlit "http://www.informatik.uni-trier.de/~ley/db/$id/index.html" 2> /dev/null | tidy -n -asxml 2> /dev/null | xml sel -N html=http://www.w3.org/1999/xhtml -t -m '//html:a' -v '@href' -n | grep "^$name" | while read path; do
# Should cache here
cachefile="$cache/$id/$path"
if ! test -f "$cachefile"; then
mkdir -p "$(dirname $cachefile)"
curlit "http://www.informatik.uni-trier.de/~ley/db/$id/$path" 2> /dev/null | tidy -n -asxml 2> /dev/null > $cachefile
echo "Got $cachefile"
fi
cat "$cachefile" | xml sel -N html=http://www.w3.org/1999/xhtml -t -m '//html:a' -v '@href' -n | egrep '^'"$prefix"'.*\.xml$' | sed -e 's#^'"$prefix"/'#<dblpkey>#' -e 's/\.xml$/<\/dblpkey>/'
done
echo "</dblp-content>"
这并没有得到文章,但你可以采取相同的方法。