2013-01-15 87 views
1

我已經成功地以xml格式獲得了一個發佈的結果頁面,並將內容寫入本地文件「Publications.xml」。問題是當我使用simplexml_load_file(「Publications.xml」)時,它失敗。無法弄清楚爲什麼。PHP Simplexml_Load_File失敗

<?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"); 
?> 

在最後但第二行解析器失敗,我收到消息「Can not」。 我有雙重檢查XML文件,它似乎是在一個很好的形狀。

如果任何人都可以讓我知道這一個的任何解決方法,我將非常感激。 下面是XML文件的副本,上面的PHP腳本試圖讀取(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) 
+0

的是什麼版本的PHP中呢? – wanovak

+0

其5.4.7,謝謝! –

+0

如果我複製XML數據,我總是在這裏得到一個錯誤:....(組1)。之後5 --->可能是「Â」的問題? ...也許它可能是有用的xml文件中使用cdata區域? – user1116033

回答

3

出於某種原因,PubMed的服務器返回了整個XML文件作爲一個HTML文件與包含XML單個<pre>標籤。它還包含多個XML片段(有幾個<PubmedArticle>元素,而且它們周圍沒有容器)。顯然這是爲了處理一些古怪的自定義代碼。

你可以通過調用SimpleXML的 「解包」 的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,其中有一個外流延到字符串(我和(string)的透明度和良好習慣做明確)的<pre>
  • 元素會給你<pre>標籤,即內容全部<PubmedArticle>個元素
  • 包裹在<dummyElement>標籤的內容會給你一個有效的XML文檔,與每個<PubmedArticle>元素的頂級子文件
+0

這就像一個魅力工作!萬分感謝! –

+0

@Sasanka如果回答您的問題,請將其標記爲「已接受」,以便將問題列爲已回答。 – IMSoP

+0

下面的問題也是pubmed相關的,關於如何在一些HTML中使用XML,在這種情況下,即使是更加難以理解的方式:[從HTML中提取xml(嵌入在HTML中)](http://stackoverflow.com/q/15855188/367456) - 當我偶然發現並記住時,將它留在這裏交叉參考。 – hakre

0

嘗試URL編碼。

注:

xml庫[Libxml 2反轉義URI,所以如果你想通過如b &Ç作爲URI 參數一個,你必須調用 使用simplexml_load_file(rawurlencode( 'http://example.com/?a='。 進行urlencode( 'B & C'))) 。自PHP 5.1.0開始,你不需要這樣做,因爲 PHP會爲你做到這一點。

simplexml_load_file

+0

嘿 感謝您的回覆。我想閱讀的XML文件已經存在。它包含內容但無法讀取。pastebin鏈接顯示該文件的副本。同樣,這兩種方式(直接從鏈接中讀取XML並從publications.XML讀取將不起作用。BTW我正在使用PHP 5.4.7 .. –

+0

對不起,在錯誤的地方發表評論 – IMSoP