Как проверить, является ли String допустимым XML-кодом, отображающим предупреждение в PHP

Я пытался проверить правильность строки как xml с помощью этой функции simplexml_load_string() Docs, но она отображает много предупреждающих сообщений.

Как я могу проверить, является ли строка допустимым XML без подавления ( @ в начале ) ошибки и отображения функции предупреждения, которая expec

Используйте 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(); } 

Из документации :

Работа с ошибками XML при загрузке документов – очень простая задача. Используя функциональность libxml , можно libxml все ошибки XML при загрузке документа, а затем перебрать ошибки.

Объект libXMLError , возвращаемый libxml_get_errors() , содержит несколько свойств, включая message , line и column (положение) ошибки.

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

тесты:

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

Он отлично работает с потоками и vfsStream, а также для тестирования.

Это должно работать

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