Разбор результатов curl из запроса PubMed и форматирование их в цитату
Это дополнительный вопрос к этому вопросу.
Та же идея: я извлекаю данные из PubMed как XML и использую curl для обработки этих результатов. Это позволяет мне собирать нужную мне информацию (список идентификаторов пабов) и использовать ее в качестве переменной для ДРУГОЙ проверки 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 окт. Bhattacharya S., Sobel JD., White TC. Комбинированный флуоресцентный анализ демонстрирует повышенную активность эффлюксного насоса как механизм резистентности в изолятах, устойчивых к азолам влагалища Candida albicans. Том 60, Выпуск 10. Журнальная статья, Противомикробные препараты и химиотерапия.
Заврел М., Белый Т.К., Важные с медицинской точки зрения грибы реагируют на азольные препараты: обновление. Том 10, Выпуск8. Журнальная статья, Обзор, Будущая микробиология.
Esquivel BD., Smith AR., Zavrel M., White TC., Азол, препарат, ввозимый в патогенный гриб Aspergillus fumigatus. Том 59, Выпуск 6. Журнальная статья, Противомикробные препараты и химиотерапия.
Апрель 2015 г. Achterman RR., Moyes DL., Thavaraj S., Smith AR., Blair KM., White TC., Naglik JR., Dermatophytes активируют кератиноциты кожи с помощью митоген-активируемой протеинкиназы передачи сигналов и индуцируют иммунные ответы. Том.83, Выпуск4. Журнальная статья, Инфекция и иммунитет.
2015 г. 3 февраля. Ford CB., Funt JM., Abbey D., Исси Л., Guiducci C., Martinez DA., Delorey T., Li BY., White TC., Cuomo C., Rao RP., Berman J.., Томпсон Д.А., Регев А., Эволюция лекарственной устойчивости у клинических изолятов Candida albicans. Том 4, Выпуск. Журнальная статья, eLife.
2014 Aug 1. White TC., Findley K., Dawson TL Jr., Scheynius A., Boekhout T., Cuomo CA., Xu J., Saunders CW., Грибки на коже: дерматофиты и Malassezia. Том 4, Выпуск8. Журнал Статья, Обзор, Колд Спринг Харбор перспективы в медицине
2014 Jan. Maguire SL., Wang C., Holland LM., Brunel F., Neuvéglise C., Nicaud JM., Zavrel M., White TC., Wolfe KH., Butler G., Факторы транскрипции цинкового пальца вытеснили белки SREBP в качестве основных регуляторов стерола в ходе эволюции Saccharomycotina. Том 10, Выпуск1. Журнальная статья, PLoS генетика.
2013 ноябрь 15. Камполи П., Перлин Д.С., Кристоф А.С., Уайт Т.К., Филлер С.Г., Шеппард Д.К., Фармакокинетика позаконазола в эпителиальных клетках и грибах: понимание потенциальных механизмов действия во время лечения и профилактики. Том 208. Выпуск 10. Журнальная статья, Журнал инфекционных заболеваний.
2013 июл 8. Achterman RR., White TC., Dermatophytes. Том 23, выпуск 13. Журнальная статья, Современная биология: CB.
И Т.П.
Это все прекрасно работает и дает цитаты только с теми данными, которые мне нужны, НО я не могу переупорядочить результаты, поэтому на первом месте стоит Author, на втором месте PubDate и т. Д. Я пробовал несколько вариантов, но я недостаточно знаком с любым из них и не могу взломать это.
Я попытался прикрепить таблицу стилей XSLT, но думаю, что это не работает, потому что я не выводил XML-файл. Может быть?
Я попытался использовать следующий XPath вместо блока SimpleXML внизу, чтобы вернуть цитаты, но получаю пустые результаты. Потому что все данные помечены как <Item>
Я пытаюсь безуспешно использовать атрибуты имени.
$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 есть идея?
1 ответ
Рассмотрим следующее чисто XSLT-решение (нет foreach
цикл необходим), который обрабатывает переупорядочение вашего узла и даже окончательный вывод, поскольку XSLT может преобразовывать содержимое XML в текст (например, строку PHP) и, конечно, даже в HTML.
Оставьте весь вызов CURL таким, как есть, но замените вложенный foreach
зацикливание. Ниже скрипт XSLT встроен в виде строки и требует PHP php_xsl
В файле.ini включено расширение для доступа к встроенному в PHP процессору XSLT 1.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;
Выход