如何检查字符串是否为有效XML而不显示PHP中的警告

jsp*_*shu 47 php xml simplexml libxml2

我试图使用此simplexml_load_string()Docs函数检查字符串的有效性为xml, 但它显示了很多警告消息.

如何检查字符串是否是有效的XML而不抑制(@在开头)错误显示expec的警告函数

Tji*_*irp 73

使用libxml_use_internal_errors()来抑制所有XML错误,然后使用libxml_get_errors()来迭代它们.

简单的XML加载字符串

libxml_use_internal_errors(true);

$doc = simplexml_load_string($xmlstr);
$xml = explode("\n", $xmlstr);

if (!$doc) {
    $errors = libxml_get_errors();

    foreach ($errors as $error) {
        echo display_xml_error($error, $xml);
    }

    libxml_clear_errors();
}
Run Code Online (Sandbox Code Playgroud)

  • 接近完美...只是添加display_xml_error函数只是一个自定义函数以一个很好的方式输出错误,它可以在这里找到http://php.net/manual/en/function.libxml-get- errors.php.起初我以为这是一个我失踪的内部功能. (6认同)
  • 小心`if(!$ doc)`!PHP认为例如命名空间文档为空,因此`!$ doc === TRUE`. (4认同)
  • 我遇到了问题,因为@David提到,我必须明确地检查`if($ doc!== FALSE)`而不仅仅是`if($ doc)`这通常就足够了. (2认同)

Fel*_*ing 21

文档:

在加载文档时处理XML错误是一项非常简单的任务.使用该libxml功能可以在加载文档时抑制所有XML错误,然后迭代错误.

libXMLError目的,通过返回libxml_get_errors(),包含几个属性,包括message,linecolumn错误的(位置).

libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if (!$sxe) {
    echo "Failed loading XML\n";
    foreach(libxml_get_errors() as $error) {
        echo "\t", $error->message;
    }
}
Run Code Online (Sandbox Code Playgroud)

参考: libxml_use_internal_errors


小智 10

我的版本是这样的:

//validate only XML. HTML will be ignored.

function isValidXml($content)
{
    $content = trim($content);
    if (empty($content)) {
        return false;
    }
    //html go to hell!
    if (stripos($content, '<!DOCTYPE html>') !== false) {
        return false;
    }

    libxml_use_internal_errors(true);
    simplexml_load_string($content);
    $errors = libxml_get_errors();          
    libxml_clear_errors();  

    return empty($errors);
}
Run Code Online (Sandbox Code Playgroud)

测试:

//false
var_dump(isValidXml('<!DOCTYPE html><html><body></body></html>'));
//true
var_dump(isValidXml('<?xml version="1.0" standalone="yes"?><root></root>'));
//false
var_dump(isValidXml(null));
//false
var_dump(isValidXml(1));
//false
var_dump(isValidXml(false));
//false
var_dump(isValidXml('asdasds'));
Run Code Online (Sandbox Code Playgroud)


Jkh*_*led 9

试试这个

//check if xml is valid document
public function _isValidXML($xml) {
    $doc = @simplexml_load_string($xml);
    if ($doc) {
        return true; //this is valid
    } else {
        return false; //this is not valid
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 问题特别要求一个不能抑制错误的解决方案(使用`@`). (9认同)