Я извлекаю данные из PubMed как XML и использую curl для обработки этих результатов, которые я загружаю на другую страницу как SimpleXML. Это позволяет мне получить необходимую мне информацию (список идентификаторов пабов) и использовать ее в качестве переменной для ДРУГОЙ очистки публикации. Этот получает сводку конкретных идентификаторов пабов. Вот мой первый файл (в конечном итоге имя $ будет динамическим):
<?php
header('Content-type: text/xml');
$name = 'white,theodore';
$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);
print $output;
curl_close($ch);
?>
Который экспортирует XML-данные, которые включают (среди прочего) список идентификаторов Pub.
<eSearchResult>
<Count>45</Count>
<RetMax>45</RetMax>
<RetStart>0</RetStart>
<IdList>
<Id>27431223</Id>
<Id>26234644</Id>
<Id>25824209</Id>
<Id>25667269</Id>
<Id>25646566</Id>
<Id>25085959</Id>
<Id>24453983</Id>
<Id>23908482</Id>
<Id>23845238</Id>
<Id>23758576</Id>
<Id>23606207</Id>
<Id>23475705</Id>
<Id>23253612</Id>
<Id>22951933</Id>
<Id>22479177</Id>
<Id>22080454</Id>
<Id>21977036</Id>
<Id>21951709</Id>
<Id>21247460</Id>
<Id>21145410</Id>
<Id>21078937</Id>
<Id>20941354</Id>
<Id>20737430</Id>
<Id>20656915</Id>
<Id>20430817</Id>
<Id>20161440</Id>
<Id>19880755</Id>
<Id>18757808</Id>
<Id>18675371</Id>
<Id>18539886</Id>
<Id>18436555</Id>
<Id>18404551</Id>
<Id>18343803</Id>
<Id>18310042</Id>
<Id>17951521</Id>
<Id>17071565</Id>
<Id>15980350</Id>
<Id>15766602</Id>
<Id>15590814</Id>
<Id>15047513</Id>
<Id>14653518</Id>
<Id>12576598</Id>
<Id>12517831</Id>
<Id>12019079</Id>
<Id>11932451</Id>
</IdList>
<TranslationSet>
<Translation>
<From>white, theodore[author]</From>
<To>White, Theodore[Full Author Name]</To>
</Translation>
</TranslationSet>
<TranslationStack>
<TermSet>
<Term>White, Theodore[Full Author Name]</Term>
<Field>Full Author Name</Field>
<Count>45</Count>
<Explode>N</Explode>
</TermSet>
<OP>GROUP</OP>
</TranslationStack>
<QueryTranslation>White, Theodore[Full Author Name] </QueryTranslation>
</eSearchResult>
Затем я загружаю это на другую страницу, чтобы использовать SimpleXML для преобразования идентификаторов Pub в переменную. И используя эту переменную, попробуйте еще один запрос curl/pubmed, этот извлекает сводки на основе этих идентификаторов:
<?php
$xml=simplexml_load_file('https://sbs2.umkc.edu/wp-content/themes/SBS_Theme/js/pubMedExport.php','SimpleXMLElement', LIBXML_NOCDATA) or die("Error: Cannot create object");
$idList = $xml->IdList;
foreach($idList->children() as $id) {
$idResult = $id . ",";
//echo $idResult;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=pubmed&id='.$id.'');
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);
$result = curl_exec($ch);
echo $result . "</br></br>";
curl_close($ch);
}
?>
Я могу экспортировать это как отдельные цитаты, но моя проблема в том, что мне все еще нужно иметь возможность захватить этот второй набор данных, чтобы я мог форматировать определенные вещи, такие как авторы, и исключать нерелевантные данные.
Вот 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>
Я не могу понять, как получить элементы из этого второго набора данных. Источник показывает, что он по-прежнему правильно отформатирован, но я продолжаю получать ошибки «Попытка получить свойство необъекта».
Я решил отправить эти результаты в еще один файл и использовать SimpleXML для управления им, но поскольку я анализирую первый файл и добавляю еще один завиток на той же странице, мне не нравится, когда я добавляю заголовок
Любая помощь будет принята с благодарностью!
ОБНОВЛЕНИЕ: спасибо @EatPeanutButter за то, что указал мне правильное направление. Используя $cxml=simplexml_load_string($result);
вместо $Cxml = new SimpleXMLElement($result);
, я смог не только получить нужные мне данные, но и объединить завитки на одной странице следующим образом.
<?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);
$result = curl_exec($ch2);
curl_close($ch2);
// Parse those results and print only what is needed for Citation format
$cxml=simplexml_load_string($result);
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>";
}
?>
И теперь, конечно же, это создало новую проблему, которую я собираюсь опубликовать в качестве дополнительного вопроса!
$results
. Можете ли вы добавить XML к вопросу, чтобы у нас был воспроизводимый пример? - person chris85   schedule 06.12.2016$xml = new SimpleXMLElement($result);
непосредственно перед эхом, а затем попробуйте прочитать XML, как вы делали это раньше. См. этот (1-й ответ) хорошую функцию, которую вы можете использовать: stackoverflow.com/questions/561816/ - person WillardSolutions   schedule 06.12.2016$Cxml = new SimpleXMLElement($result); echo $Cxml;
Обертывание в функцию, подобную предложенной ссылке, похоже, не помогло. Те же результаты, за исключением того, что он больше не распознает мою переменную $id, поэтому я вручную подключил некоторые идентификаторы для проверки и все равно получил пустую страницу. Одна проблема, которую я обнаружил, заключалась в том, что я использовал $result для двух разных переменных. Я исправил это, переименовав верхний $idResult. Но это не помогло. - person cebronix   schedule 07.12.2016$cxml=simplexml_load_string($result);
вместо$Cxml = new SimpleXMLElement($result);
, и теперь я могу захватить отдельные элементы! Я до сих пор не могу понять, почему, если я использую $idResult во втором запросе вместо $id, он возвращает только последний элемент. Струна хорошо звучит. Это заставляет меня включить завиток внутри цикла. В то время как если я вставлю экспортированный $idResult, он будет работать нормально. - person cebronix   schedule 07.12.2016foreach($idList->children() as $id) { $idResult .= $id . ","; }
- person cebronix   schedule 09.12.2016