Я пытался проверить правильность строки как 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 }