Анализ результатов curl как simpleXML и использование их для создания новых XML-данных

Я извлекаю данные из 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.

вывод XML

<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>";
}

?>

И теперь, конечно же, это создало новую проблему, которую я собираюсь опубликовать в качестве дополнительного вопроса!


person cebronix    schedule 05.12.2016    source источник
comment
Я немного запутался - вы хотите отформатировать данные на втором снимке экрана (я думаю, это то, что возвращается из запросов cURL в цикле foreach)? Это просто возвращается как обычный текст или как XML?   -  person WillardSolutions    schedule 06.12.2016
comment
Да, мне нужно иметь возможность разбивать эти цитаты, чтобы я мог добавлять и оформлять только то, что мне нужно. Это перекликается с блоками, которые вы видите на втором снимке экрана, но источник показывает структуру XML. Я не смог добавить третий скриншот (без представителя), поэтому добавил его в свой дропбокс здесь: dropbox.com/s/64echgckquybbu0/ — когда я пытаюсь получить их с помощью $results-›esummaryresult-› и т. д., я получаю попытку получить свойство необъектной ошибки.   -  person cebronix    schedule 06.12.2016
comment
В вашем коде нет $results. Можете ли вы добавить XML к вопросу, чтобы у нас был воспроизводимый пример?   -  person chris85    schedule 06.12.2016
comment
Ошибка заключается в том, что вы пытаетесь получить доступ к объекту XML без предварительного анализа его как XML. Попробуйте добавить $xml = new SimpleXMLElement($result); непосредственно перед эхом, а затем попробуйте прочитать XML, как вы делали это раньше. См. этот (1-й ответ) хорошую функцию, которую вы можете использовать: stackoverflow.com/questions/561816/   -  person WillardSolutions    schedule 06.12.2016
comment
Извините, $результат. Не во множественном числе. Я добавлю XML.   -  person cebronix    schedule 06.12.2016
comment
Вы добавили 2 файла XML. Какой файл у вас возникли проблемы с разбором? Вы также могли нарушить условия PM с этим кодом, разве это не 1 запрос в 3 секунды?   -  person chris85    schedule 06.12.2016
comment
@EatPeanutButter Анализ его как XML возвращает пустую страницу, включая источник. $Cxml = new SimpleXMLElement($result); echo $Cxml;Обертывание в функцию, подобную предложенной ссылке, похоже, не помогло. Те же результаты, за исключением того, что он больше не распознает мою переменную $id, поэтому я вручную подключил некоторые идентификаторы для проверки и все равно получил пустую страницу. Одна проблема, которую я обнаружил, заключалась в том, что я использовал $result для двух разных переменных. Я исправил это, переименовав верхний $idResult. Но это не помогло.   -  person cebronix    schedule 07.12.2016
comment
@ chris85, это второй набор, который я не могу разобрать. Второй набор берет данные из первого набора для своего запроса. Когда вы спросили о терминах PM, вы имели в виду, что, возможно, поэтому, если я использую строку идентификаторов в качестве своего запроса, он возвращает только последний результат? Я не думаю, что это проблема, потому что, если я вручную вставлю строку из нескольких идентификаторов, она загрузит их все.   -  person cebronix    schedule 07.12.2016
comment
Я думаю, что я мог получить его! Я использовал $cxml=simplexml_load_string($result); вместо $Cxml = new SimpleXMLElement($result);, и теперь я могу захватить отдельные элементы! Я до сих пор не могу понять, почему, если я использую $idResult во втором запросе вместо $id, он возвращает только последний элемент. Струна хорошо звучит. Это заставляет меня включить завиток внутри цикла. В то время как если я вставлю экспортированный $idResult, он будет работать нормально.   -  person cebronix    schedule 07.12.2016
comment
И на случай, если кто-то все еще это читает, я разобрался с проблемой $idResult. Оказывается, я вообще не объединял строку. Только поставить запятую. Я должен был добавить, что один период прилипания. foreach($idList->children() as $id) { $idResult .= $id . ","; }   -  person cebronix    schedule 09.12.2016