PHP,simplexml_load_string检查string是否为xml

时间:2014-03-11 02:59:24

标签: php xml

我正在编写一个脚本来处理jsonp响应。这样我就可以解释它,将它发送到客户端,并在ajax中使用我自己的回调。无论如何,服务器的响应是json,如果成功的话。如果请求失败,则返回xml。

我之前检查了一些答案。

Check whether returned file is XML or not

How check if a String is a Valid XML with-out Displaying a Warning in PHP

这个答案很好,我很糟糕。

我写这个。

$xml = simplexml_load_string($result,'SimpleXmlElement', LIBXML_NOERROR+LIBXML_ERR_FATAL+LIBXML_ERR_NONE);
if(!$xml){// json}

这会发出警告,

  

节点不再存在

警告进入json响应,难以解析。

我知道如果我在php中抑制警告,它会正常工作,但这不是我想要的答案。我想知道,我如何检查字符串格式,而不发出警告。即使在发展中的环境。我认为从根本上解决问题会更好。

然后我用了这个,

$xml = simplexml_load_string($result,'SimpleXmlElement', LIBXML_NOERROR+LIBXML_ERR_FATAL+LIBXML_ERR_NONE);
if($xml == false){ // json }

无论字符串是xml还是json,都会进入块。 $xml == false始终被评估为真。

我想如果你能向我解释一下,$xml == false!$xml之间的区别就会很大。提前谢谢。

1 个答案:

答案 0 :(得分:2)

由于有人要求在不解析XML的情况下检测XML,因此以下正则表达式应匹配有效的XML字符串,至少初步:

^(<([a-zA-Z0-9]+)([\s]+[a-zA-Z0-9]+="[a-zA-Z0-9]+")*>([^<]*([^<]*|(?1))[^<]*)*<\/\2>)$

可在此处测试:http://regex101.com/r/mW9aZ5

但是,我仍然认为libxml方式更好。 :)

- 编辑1

原来这是一个副本:How check if a String is a Valid XML with-out Displaying a Warning in PHP

Tjirp使用libxml_use_internal_errors(true);在该线程中的答案效率更高。我建议使用它。

- 我的原始答案,效率低下

编辑: 这需要遍历每个节点调用->isValid()的XML树中的每个节点。 ->isValid() 检查当前节点。正如人们所预料的那样,它不会立即检查整个树。值得注意的是,PHP.net上的文档含糊不清,缺乏完整有用的用法示例。我把它留在了这里,而不是因为这个原因删除它。

您可以使用XMLReader::isValid()来验证打开的XML文件或字符串是否实际包含有效的XML。

$result字符串本身加载:

$xml = new XMLReader();
$xml->xml($result);
$xml->setParserProperty(XMLReader::VALIDATE, true);
$success = true;
while ($xml->read()) {
    if (!$xml->isValid()) {
        $success = false;
    }
}
if ($success) {
    // Return valid response
} else {
    // Return invalid response
}

或者,您也可以从文件系统上的文件加载XML:

$xml = new XMLReader();
$xml->open($file);
// Rest of code as above

关于if ($xml == false)始终评估为true,除非$xml 始终为false,否则永远不会发生这种情况。你确定你不是无意中写了if ($xml = false)而是偶然吗?