【问题标题】:PHP Simplexml_Load_File failsPHP Simplexml_Load_File 失败
【发布时间】:2012-12-29 23:18:58
【问题描述】:

我已经成功地获得了 xml 格式的 pubmed 结果页面并将内容写入本地文件“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");
?>

在最后但第二行解析器失败,我收到消息“不能”。 我仔细检查了 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)

【问题讨论】:

  • 如果我复制 xml 数据,这里总是会出错:....(第 1 组)。 5 ---> 之后可能是“”的问题吗? ...也许在 xml 文件中使用 cdata 区域会很有用?

标签: php xml simplexml ncbi


【解决方案1】:

试试 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

【讨论】:

  • 您好,感谢您的回复。我要读取的 XML 文件已经存在。它有内容但无法读取.. pastebin 链接显示文件的副本。两种方式(直接从链接读取 XML 和从 Publications.XML 读取都行不通。顺便说一句,我使用的是 php 5.4.7 ..
【解决方案2】:

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

您可以通过调用 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,它有一个外部元素 &lt;pre&gt;
  • 将其转换为字符串(为了清晰和良好的习惯,我已经明确地使用(string) 完成)将为您提供该&lt;pre&gt; 标记的内容,即所有&lt;PubmedArticle&gt; 元素
  • 将该内容包装在 &lt;dummyElement&gt; 标记中将为您提供一个有效的 XML 文档,其中每个 &lt;PubmedArticle&gt; 元素都作为文档中的顶级子元素

【讨论】:

  • @Sasanka 如果这回答了您的问题,请将其标记为“已接受”,以便将问题列为已回答。
  • 以下问题也与发布相关,关于在某些 HTML 中包含 XML,在这种情况下甚至以更微妙的方式:extract xml from xml embebed in html - 只是将它留在这里进行交叉引用,因为我偶然发现记住了。
猜你喜欢
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2011-09-27
  • 2016-10-16
  • 1970-01-01
相关资源
最近更新 更多