1

公開された結果ページをxml形式で取得し、その内容をローカルファイル「Publications.xml」に書き込むことができました。問題は、simplexml_load_file( "Publications.xml")を使用すると、失敗することです。理由がわからない。

<?php
$feed = 'http://www.ncbi.nlm.nih.gov/pubmed?term=carl&sort=pubdate&report=xml';
$local = 'Publications.xml';
$curtime = time();
$filemodtime;
if( (!file_exists($local)) || (time() - filemtime($local)) > 86400 )
{
    $contents = file_get_contents($feed);
    $fp = fopen($local,"w");
    fwrite($fp, $contents);
    fclose($fp);
}
$xml = simplexml_load_file($local) or ("Can't");
?>

最後の2行目でパーサーが失敗し、「できません」というメッセージが表示されます。xmlファイルを再確認しましたが、良好な状態であるように見えます。

誰かがこれの回避策について私に知らせてくれれば、私は非常に感謝します。上記のPHPスクリプトが読み取ろうとするxmlファイルのコピーは次のとおりです(http://pastebin.com/U0fEKmZL):

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<pre>
&lt;PubmedArticle&gt;
    &lt;MedlineCitation Status="Publisher" Owner="NLM"&gt;
        &lt;PMID Version="1"&gt;23314841&lt;/PMID&gt;
        &lt;DateCreated&gt;
            &lt;Year&gt;2013&lt;/Year&gt;
            &lt;Month&gt;1&lt;/Month&gt;
            &lt;Day&gt;14&lt;/Day&gt;
        &lt;/DateCreated&gt;
        &lt;Article PubModel="Print-Electronic"&gt;
            &lt;Journal&gt;
                &lt;ISSN IssnType="Electronic"&gt;1432-0932&lt;/ISSN&gt;
                &lt;JournalIssue CitedMedium="Internet"&gt;
                    &lt;PubDate&gt;
                        &lt;Year&gt;2013&lt;/Year&gt;
                        &lt;Month&gt;Jan&lt;/Month&gt;
                        &lt;Day&gt;12&lt;/Day&gt;
                    &lt;/PubDate&gt;

 ... (too long, see link)
4

2 に答える 2

3

<pre>何らかの理由で、pubmedサーバーはそのXMLファイル全体をXMLを含む単一のタグを持つHTMLファイルとして返しています。また、複数のXMLフラグメントが含まれています(いくつかの<PubmedArticle>要素があり、それらの周りにコンテナーはありません)。明らかに、これはいくつかの風変わりなカスタムコードによって処理されることを意図しています。

次のように、SimpleXMLを2回呼び出すことで、XMLを「アンラップ」できます。

$outer_xml = simplexml_load_file($local);
$inner_xml = simplexml_load_string('<dummyContainer>' . (string)$outer_xml . '</dummyContainer>');
foreach ( $inner_xml->PubmedArticle as $article )
{
    // etc
}

説明する:

  • 外側の「XMLドキュメント」はHTMLであり、<pre>
  • (string)それを文字列にキャストすると(明確さと良い習慣のために明示的に行いました)、その<pre>タグのコンテンツ、つまりすべての<PubmedArticle>要素が得られます
  • そのコンテンツをタグでラップする<dummyElement>と、有効なXMLドキュメントが得られ、各<PubmedArticle>要素がドキュメントの最上位の子になります。
于 2013-01-15T20:35:40.843 に答える
0

urlencodingを試してください。

ノート:

Libxml 2はURIのエスケープを解除するため、たとえばb&cをURIパラメーターaとして渡したい場合は、 simplexml_load_file(rawurlencode('http://example.com/?a='。urlencode('b&c')))を呼び出す必要があります 。 。PHP 5.1.0以降、PHPが自動的に実行するため、これを実行する必要はありません。

simplexml_load_file

于 2013-01-15T19:04:23.633 に答える