2013-01-15 54 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