如何检查一个string是否是一个有效的XML在PHP中显示警告

我试图使用这个simplexml_load_string() Docs函数检查string的有效性为xml,但它显示了很多警告消息。

我怎样才能检查一个string是否是一个有效的XML而不压制( @在开始 )的错误, 显示一个警告函数,预计

使用libxml_use_internal_errors()来取消所有的XML错误,然后使用libxml_get_errors()来遍历它们。

简单的XML加载string

 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(); } 

从文档 :

加载文档时处理XML错误是一项非常简单的任务。 使用libxmlfunction可以在加载文档时抑制所有XML错误,然后遍历错误。

libxml_get_errors()返回的libXMLError对象包含几个属性,包括错误的messagelinecolumn (位置)。

 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; } } 

参考: libxml_use_internal_errors

试试这个

 //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 } } 

我的版本是这样的:

 //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); } 

testing:

 //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')); 

这是我刚才写的一小段课:

 /** * Class XmlParser * @author Francesco Casula <fra.casula@gmail.com> */ class XmlParser { /** * @param string $xmlFilename Path to the XML file * @param string $version 1.0 * @param string $encoding utf-8 * @return bool */ public function isXMLFileValid($xmlFilename, $version = '1.0', $encoding = 'utf-8') { $xmlContent = file_get_contents($xmlFilename); return $this->isXMLContentValid($xmlContent, $version, $encoding); } /** * @param string $xmlContent A well-formed XML string * @param string $version 1.0 * @param string $encoding utf-8 * @return bool */ public function isXMLContentValid($xmlContent, $version = '1.0', $encoding = 'utf-8') { if (trim($xmlContent) == '') { return false; } libxml_use_internal_errors(true); $doc = new DOMDocument($version, $encoding); $doc->loadXML($xmlContent); $errors = libxml_get_errors(); libxml_clear_errors(); return empty($errors); } } 

它适用于stream和vfsStream也适用于testing目的。

这应该工作

 if(strpos($xmlstring, '<?xml') === 0) { //is an xml } else { //not an xml }