这是this问题的后续问题.
同样的想法:我以XML的形式从PubMed中提取数据,并使用curl来处理这些结果。这允许我获取我需要的信息(一个发布I列表),并将其用作另一个PubMed刮擦的变量。$name最终将是动态的。
<?php
$name = 'white,theodore';
// Return xml data from PubMed based on author search name
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term='.$name.'[author]&retmode=xml&retmax=50');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
$output = curl_exec($ch);
curl_close($ch);
// Parse the results and concatenate into a string of Publication IDs
$xml=simplexml_load_string($output);
$idList = $xml->IdList;
$ids = "";
foreach($idList->children() as $id) {
$ids .= $id . ",";
}
// Plug that string of IDs into another PubMed search, this one returning XML data for Publication Summaries
$path = 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id='.$ids;
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, $path);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch2, CURLOPT_VERBOSE, 0);
curl_setopt($ch2, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch2, CURLOPT_AUTOREFERER, true);
curl_setopt($ch2, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch2, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch2, CURLOPT_FRESH_CONNECT, 1);
$data = curl_exec($ch2);
curl_close($ch2);
// Parse those results and print only what is needed for Citation format
$cxml=simplexml_load_string($data);
foreach($cxml->children() as $docsum) {
foreach($docsum->children() as $item) {
foreach($item->children() as $details) {
if ((string) $details['Name'] === 'Author') {echo $details . "., ";}
}
if ((string) $item['Name'] === 'FullJournalName') { echo $item . ". "; }
if ((string) $item['Name'] === 'Title') { echo "<strong>" . $item . "</strong> "; }
if ((string) $item['Name'] === 'Volume') { echo "Vol." . $item . ", "; }
if ((string) $item['Name'] === 'Issue') { echo "Issue" . $item . ". "; }
if ((string) $item['Name'] === 'PubDate') { echo $item . ". "; }
foreach($item->children() as $details) {
if ((string) $details['Name'] === 'PubType') {echo $details . ", ";}
}
}
echo "</br></br>";
}
?>它返回以下XML数据(这是一个结果)。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE eSummaryResult PUBLIC "-//NLM//DTD esummary v1 20041029//EN" "https://eutils.ncbi.nlm.nih.gov/eutils/dtd/20041029/esummary-v1.dtd">
<eSummaryResult>
<DocSum>
<Id>27431223</Id>
<Item Name="PubDate" Type="Date">2016 Oct</Item>
<Item Name="EPubDate" Type="Date">2016 Sep 23</Item>
<Item Name="Source" Type="String">Antimicrob Agents Chemother</Item>
<Item Name="AuthorList" Type="List">
<Item Name="Author" Type="String">Bhattacharya S</Item>
<Item Name="Author" Type="String">Sobel JD</Item>
<Item Name="Author" Type="String">White TC</Item>
</Item>
<Item Name="LastAuthor" Type="String">White TC</Item>
<Item Name="Title" Type="String">A Combination Fluorescence Assay Demonstrates Increased Efflux Pump Activity as a Resistance Mechanism in Azole-Resistant Vaginal Candida albicans Isolates.</Item>
<Item Name="Volume" Type="String">60</Item>
<Item Name="Issue" Type="String">10</Item>
<Item Name="Pages" Type="String">5858-66</Item>
<Item Name="LangList" Type="List">
<Item Name="Lang" Type="String">English</Item>
</Item>
<Item Name="NlmUniqueID" Type="String">0315061</Item>
<Item Name="ISSN" Type="String">0066-4804</Item>
<Item Name="ESSN" Type="String">1098-6596</Item>
<Item Name="PubTypeList" Type="List">
<Item Name="PubType" Type="String">Journal Article</Item>
</Item>
<Item Name="RecordStatus" Type="String">Unknown status</Item>
<Item Name="PubStatus" Type="String">epublish</Item>
<Item Name="ArticleIds" Type="List">
<Item Name="pubmed" Type="String">27431223</Item>
<Item Name="pii" Type="String">AAC.01252-16</Item>
<Item Name="doi" Type="String">10.1128/AAC.01252-16</Item>
<Item Name="pmc" Type="String">PMC5038269</Item>
<Item Name="rid" Type="String">27431223</Item>
<Item Name="eid" Type="String">27431223</Item>
<Item Name="pmcid" Type="String">pmc-id: PMC5038269;embargo-date: 2017/04/01;</Item>
</Item>
<Item Name="DOI" Type="String">10.1128/AAC.01252-16</Item>
<Item Name="History" Type="List">
<Item Name="received" Type="Date">2016/06/10 00:00</Item>
<Item Name="accepted" Type="Date">2016/07/12 00:00</Item>
<Item Name="pmc-release" Type="Date">2017/04/01 00:00</Item>
<Item Name="entrez" Type="Date">2016/07/20 06:00</Item>
<Item Name="pubmed" Type="Date">2016/07/20 06:00</Item>
<Item Name="medline" Type="Date">2016/07/20 06:00</Item>
</Item>
<Item Name="References" Type="List"></Item>
<Item Name="HasAbstract" Type="Integer">1</Item>
<Item Name="PmcRefCount" Type="Integer">0</Item>
<Item Name="FullJournalName" Type="String">Antimicrobial agents and chemotherapy</Item>
<Item Name="ELocationID" Type="String">doi: 10.1128/AAC.01252-16</Item>
<Item Name="SO" Type="String">2016 Oct;60(10):5858-66</Item>
</DocSum>
</eSummaryResult>
</br></br>与此相呼应:
2016年10月,Bhattacharya S.,Sobel JD.,White TC.,一种联合荧光检测显示,作为一种耐唑耐药的阴道念珠菌分离株,外排泵活性增加。第60卷,Issue10.期刊文章,抗菌药物和化疗。
2015年4月. Achterman RR.,Moyes DL.,Thavaraj S.,Smith AR.,Blair KM.,White TC.,Naglik JR.,皮肤角质形成细胞通过丝裂原活化蛋白激酶信号和诱导免疫反应。第83卷,Issue4.期刊文章,感染和免疫。
2015年2月3日。福特公司,Funt JM.,Abbey D.,Issi L.,Guiducci .,Martinez DA.,Delorey T.,Li BY.,White TC.,Cuomo C.,Rao RP.,Berman J.,Thompson DA.,Regev A.,白色念珠菌临床分离株耐药性的演变。第4卷,发行。期刊文章,eLife.
2014年8月1日,白色TC.,Findley K.,Dawson TL Jr.,Scheynius A.,Boekhout T.,Cuomo CA.,Xu J.,Saunders CW.,真菌在皮肤上:皮肤病和马拉色菌。第4卷,Issue8.期刊文章,评论,冷泉港在医学上的观点。
2014年1月,Maguire SL.,Wang C.,荷兰LM.,Brunel F.,Neuvéglise C.,Nicaud JM.,Zavrel M.,White TC.,Wolfe KH.,Butler G.,锌指转录因子取代SREBP蛋白,成为Saccharomycotina进化过程中的主要甾醇调节因子。第10卷,Issue1.期刊文章,PLoS遗传学。
2013年11月15日。Campoli P.,Perlin DS.,Kristof AS.,White TC.,Filler SG.,Sheppard DC.,P.泊沙康唑在上皮细胞和真菌中的药物动力学:对治疗和预防过程中潜在作用机制的认识。第208卷,Issue10.期刊文章,传染病杂志。
2013年7月8日. Achterman RR.,白三叶,皮癣菌。第23卷,Issue13.期刊文章,当前生物学: CB。
等。
所有这些都很好,只引用了我需要的数据,但我无法重新排序结果,所以作者优先,PubDate是最后的,等等。我尝试了许多选择,但我对其中任何一个都不熟悉,似乎无法破解。
我尝试过附加XSLT样式表,但我认为这不起作用,因为我实际上并没有输出XML文件。也许吧?
我尝试使用下面的XPath,而不是底部的SimpleXML块返回引用,但始终得到空白的结果。因为所有数据都被标记为<Item>,所以我试图使用Name属性,但没有成功。
$content = simplexml_load_string($data);
$results = $content->xpath('Item[@Name]');
foreach($results as $result) {
$title = $result->xpath('[@Name="Title"]');
// Make sure there's an author attribute
if($title) {
// because we have a list of elements even if there's one result
$items = $title[0]->attributes();
$title = $items['value'];
}
echo $results;
}我也尝试过DOMXPath和GetElementsByTagName,但都没有结果。
基本上我被困住了。我尝试了很多不同的方法,也犯了太多的错误,我觉得自己就像在兜圈子。任何有更多Xpath或XSLT经验的人都有想法吗?
发布于 2016-12-15 17:34:59
考虑以下纯XSLT解决方案(不需要foreach循环),它处理节点重新排序,甚至最终输出,因为XSLT可以将XML内容转换为文本(即PHP ),甚至是HTML。
让整个CURL调用保持原样,但替换嵌套的foreach循环。在XSLT脚本下面嵌入为字符串,需要在.ini文件中启用PHP的.ini扩展来访问PHP内置XSLT1.0处理器(即libxslt):
// ... same CURL call ...
// Parse those results and print only what is needed for Citation format
$cxml=simplexml_load_string($data);
$xslstr = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="text"/>
<xsl:strip-space elements="*"/>
<xsl:template match="DocSum">
<xsl:if test="Item[@Name=\'AuthorList\' and .!=\'\']">
<xsl:for-each select="Item[@Name=\'AuthorList\' and .!=\'\']/*">
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each><xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'FullJournalName\' and .!=\'\']">
<xsl:value-of select="concat(\'<strong>\', Item[@Name=\'FullJournalName\'],
\'</strong>\')" />
<xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'Title\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'Title\']" /><xsl:text>, </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'Volume\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'Volume\']" /><xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'Issue\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'Issue\']" /><xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'PubDate\' and .!=\'\']">
<xsl:value-of select="Item[@Name=\'PubDate\']" /><xsl:text>. </xsl:text>
</xsl:if>
<xsl:if test="Item[@Name=\'PubTypeList\' and .!=\'\']">
<xsl:for-each select="Item[@Name=\'PubTypeList\']/*">
<xsl:value-of select="." />
<xsl:if test="position() != last()">
<xsl:text>, </xsl:text>
</xsl:if>
</xsl:for-each><xsl:text>. </xsl:text>
</xsl:if>
<xsl:text><br><br></xsl:text>
</xsl:template>
</xsl:stylesheet>';
$xsl=simplexml_load_string($xslstr);
// XSLT TRANSFORMATION
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl);
$newXML = $proc->transformToXML($cxml);
echo $newXML;输出

https://stackoverflow.com/questions/41168505
复制相似问题