2

これは、この質問のフォローアップの質問です。

同じ考え: PubMed からデータを XML として取得し、curl を使用してそれらの結果を処理しています。これにより、必要な情報 (パブ ID のリスト) を取得し、それを別の 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 データを返します (これは 1 つの結果です)。

<?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.、Azole-Resistant Vaginal Candida albicans Isolates における抵抗メカニズムとしての組み合わせ蛍光アッセイによる排出ポンプ活性の増加。Vol.60、Issue10。ジャーナル記事、抗菌剤と化学療法。

  1. Zavrel M.、White TC.、医学的に重要な真菌はアゾール薬に反応します: 最新情報。Vol.10、Issue8。ジャーナル記事、総説、未来の微生物学。

  2. Esquivel BD.、Smith AR.、Zavrel M.、White TC.、病原菌アスペルギルス フミガタスへのアゾール薬の輸入。Vol.59、Issue6。ジャーナル記事、抗菌剤と化学療法。

2015 年 4 月 Achterman RR.、Moyes DL.、Thavaraj S.、Smith AR.、Blair KM.、White TC.、Naglik JR.、Dermatophytes は、マイトジェン活性化プロテインキナーゼ シグナル伝達を介して皮膚ケラチノ サイトを活性化し、免疫応答を誘導します。Vol.83、Issue4。ジャーナル記事、感染と免疫。

2015 年 2 月 3 日。Ford CB.、Funt JM.、Abbey D.、Issi L.、Guiducci C.、Martinez DA.、Delorey T.、Li BY.、White TC.、Cuomo C.、Rao RP.、Berman J .、Thompson DA.、Regev A.、Candida albicans の臨床分離株における薬剤耐性の進化。Vol.4、発行。ジャーナル記事、eLife。

2014 年 8 月 1 日。White TC.、Findley K.、Dawson TL Jr.、Scheynius A.、Boekhout T.、Cuomo CA.、Xu J.、Saunders CW.、皮膚の真菌: 皮膚糸状菌およびマラセチア。Vol.4、Issue8。ジャーナル記事、レビュー、医学におけるコールド スプリング ハーバーの展望。

2014 年 1 月 Maguire SL.、Wang C.、Holland LM.、Brunel F.、Neuvéglise C.、Nicaud JM.、Zavrel M.、White TC.、Wolfe KH.、Butler G.、Zinc finger 転写因子が SREBP タンパク質を置換Saccharomycotina 進化中の主要なステロール調節因子として。Vol.10、Issue1。ジャーナル記事、PLoS 遺伝学。

2013 年 11 月 15 日。Campoli P.、Perlin DS.、Kristof AS.、White TC.、Filler SG.、Sheppard DC.、上皮細胞および真菌内のポサコナゾールの薬物動態: 治療および予防中の潜在的な作用機序への洞察。Vol.208、Issue10。ジャーナル記事、感染症ジャーナル。

2013 年 7 月 8 日。Achterman RR.、White TC.、Dermatophytes。Vol.23、Issue13。ジャーナル記事、現在の生物学: CB.

等。

それはすべてうまく機能し、必要なデータのみで引用を生成しますが、結果を並べ替えることができないため、著者が最初に来て、PubDate が最後に来るなどです。それをクラックすることはできません。

XSLT スタイル シートを添付しようとしましたが、実際には XML ファイルを出力していないため、機能していないと思います。多分?

一番下の SimpleXML ブロックの代わりに次の XPath を使用して引用を返してみましたが、空白の結果が得られ続けます。すべてのデータが としてタグ付けされ<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 の経験が豊富な方にアイデアはありますか?

4

1 に答える 1

2

foreachXSLT は XML コンテンツをテキスト (つまり、PHP 文字列) に、そしてもちろん HTML に変換できるため、ノードの並べ替えと最終出力を処理する次の純粋な XSLT ソリューション (ループは必要ありません) を検討してください。

CURL 呼び出し全体をそのままにして、ネストされたforeachループを置き換えます。以下の XSLT スクリプトは文字列として埋め込まれており、php_xslPHP の組み込み XSLT 1.0 プロセッサ (つまり libxslt) にアクセスするには、.ini ファイルで PHP の拡張機能を有効にする必要があります。

// ... 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(\'&lt;strong&gt;\', Item[@Name=\'FullJournalName\'], 
                                     \'&lt;/strong&gt;\')" />
        <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>&lt;br&gt;&lt;br&gt;</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;

出力

引用出力

于 2016-12-15T17:34:59.803 に答える