Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Simplexml_加载_文件失败_Php_Xml_Simplexml_Ncbi - Fatal编程技术网

PHP Simplexml_加载_文件失败

PHP Simplexml_加载_文件失败,php,xml,simplexml,ncbi,Php,Xml,Simplexml,Ncbi,我已经成功地获得了一个xml格式的pubmed结果页面,并将内容写入本地文件“Publications.xml”。问题是当我使用simplexml加载文件(“Publications.xml”)时,它失败了。不知道为什么 <?php $feed = 'http://www.ncbi.nlm.nih.gov/pubmed?term=carl&sort=pubdate&report=xml'; $local = 'Publications.xml'; $curtime = ti

我已经成功地获得了一个xml格式的pubmed结果页面,并将内容写入本地文件“Publications.xml”。问题是当我使用simplexml加载文件(“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");
?>
86400)
{
$contents=file\u get\u contents($feed);
$fp=fopen($local,“w”);
fwrite($fp,$contents);
fclose($fp);
}
$xml=simplexml_load_文件($local)或(“Can”);
?>
在最后但第二行,解析器失败,我得到消息“不能”。 我仔细检查了xml文件,它看起来状态良好

如果有人能让我知道这个问题的解决方法,我将非常感激。 下面是上面的PHP脚本试图读取的xml文件的副本():


公共物品
MedlineCitation Status=“Publisher”Owner=“NLM”
PMID Version=“1”23314841/PMID
日期创建
2013年/年度
月1/月
第14天/天
/日期创建
文章PubModel=“打印电子版”
杂志
ISSN IssnType=“电子”1432-0932/ISSN
Journalissae CitedMedium=“互联网”
出版日期
2013年/年度
月/月
第12天/天
/出版日期
... (太长,请参阅链接)
尝试URL编码

注:

libxml2取消了URI的映射,因此如果您想将例如b&c作为URI传递 参数a,您必须调用 simplexml加载文件(rawurlencode('http://example.com/?a=' . urlencode('b&c'))。由于PHP5.1.0,您不需要这样做,因为 PHP将为您做这件事


出于某种原因,pubmed服务器将整个XML文件作为HTML文件返回,其中包含一个包含XML的
标记。它还包含多个XML片段(有几个
元素,周围没有容器)。显然,这是打算由一些古怪的自定义代码来处理的

您可以通过两次调用SimpleXML来“展开”XML,如下所示:

$outer\u xml=simplexml\u load\u文件($local);
$inner_xml=simplexml_load_string(“”。(string)$outer_xml.“”);
foreach($inner_xml->PubmedArticle作为$article)
{
//等
}
解释:

  • 外部的“XML文档”是HTML,它有一个外部元素
  • 将其转换为字符串(为了清晰和良好习惯,我已明确使用
    (string)
    )将为您提供
    标记的内容,即所有
    元素
  • 将该内容包装在
    标记中将得到一个有效的XML文档,其中每个
    元素都作为文档中的顶级子元素

嘿,谢谢您的回复。我要读取的XML文件已经存在。它有内容,但无法阅读。。pastebin链接显示文件的副本。另外,这两种方法(直接从链接读取XML和从publications.XML读取XML)都不起作用。顺便说一句,我使用的是PHP5.4.7。如果我复制XML数据,我总是会在这里得到一个错误:…(第1组)。5之后-->可能是“第1组”问题?…也许在xml文件中使用cdata区域是有用的?@Sasanka如果这回答了您的问题,请将其标记为“已接受”下面的问题也是与pubmed相关的,关于在一些HTML中包含XML,在这种情况下,甚至是以更精确的方式:-只是把它留在这里作为交叉参考,因为我无意中发现并记住了它。
<?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)
$outer_xml = simplexml_load_file($local);
$inner_xml = simplexml_load_string('<dummyContainer>' . (string)$outer_xml . '</dummyContainer>');
foreach ( $inner_xml->PubmedArticle as $article )
{
    // etc
}