【问题标题】:Check whether returned file is XML or not检查返回的文件是否为 XML
【发布时间】:2012-03-01 23:16:37
【问题描述】:

我需要检查网站输出的返回值。如果登录详细信息有效,它会返回一个 XML 文件,如果登录详细信息无效,它只会返回一个字符串,上面写着“您输入了无效的 id”。

我的问题是我用这段代码检查过,

$ch = curl_init();

            curl_setopt($ch, CURLOPT_URL, $url);

            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

            $output = curl_exec($ch);

            curl_close($ch);

            if(simplexml_load_string($output)){
                echo 'Is XML';
             }else{
               echo 'Not XML';
                 }

问题是它正在检查和显示消息,但我收到这些错误

警告:simplexml_load_string() [function.simplexml-load-string]: 实体:第 1 行:解析器错误:需要开始标记,'

警告:simplexml_load_string() [function.simplexml-load-string]:

警告:simplexml_load_string() [function.simplexml-load-string]: ^ 在

有没有办法解决这些错误。过去一个小时我一直在互联网上搜索,但没有任何成功。

谢谢

【问题讨论】:

    标签: php xml curl


    【解决方案1】:

    检查前5个字符是否等于<?xml,这应该是一个很好的线索。

    if(substr($output, 0, 5) == "<?xml") {
        echo 'Is XML';
    } else {
        echo 'Not XML';
    }
    

    【讨论】:

    • 我觉得这个会更好strpos($output, '&lt;?xml') === 0
    • @Yekver 从技术上讲 substr 会更快,因为它不必搜索整个字符串。不过,差异可能可以忽略不计。
    • 当您收到实际上是 xml 的文件时,即使没有 .xml 扩展名,也很简单且非常优雅......
    • 有点晚了,但是:此解决方案不会将没有 XML 声明的有效 XML 1.0 文件视为它们的本来面目。建议使用 XML 声明,但不是强制性的。请参阅那里答案的第一段:stackoverflow.com/a/7007781/1704604
    • 特别是这不适用于 XMP 文件,这些文件是以 &lt;?xpacket 开头的 XML 文件,所以我认为肯定还有一堆其他的 XML 类型也以它们自己的东西开头。跨度>
    【解决方案2】:
    $result = simplexml_load_string ($data, 'SimpleXmlElement', LIBXML_NOERROR+LIBXML_ERR_FATAL+LIBXML_ERR_NONE);
    if (false == $result) echo 'error';
    

    【讨论】:

    • 但是如果if (false == $result) 真的是假的,我会收到一个错误Node no longer exists。我该如何预防?
    【解决方案3】:

    也可能是因为返回数据的第一行是空白 - 在将字符串解析为 XML 之前尝试$output = trim($output)

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 2015-10-20
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2017-08-08
      • 1970-01-01
      相关资源
      最近更新 更多