Как проверить, является ли String допустимым XML-кодом, отображающим предупреждение в PHP
Я пытался проверить правильность строки как xml, используя эту simplexml_load_string()
Docs, но она отображает много предупреждающих сообщений.
Как проверить, является ли строка допустимым XML без подавления (@
в начале) ошибка и отображает функцию предупреждения, которая expec
Ответы
Ответ 1
Используйте 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();
}
Ответ 2
В документации :
Работа с ошибками XML при загрузке документов - очень простая задача. Используя функциональность 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
Ответ 3
попробуйте этот
//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
}
}
Ответ 4
Моя версия:
//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'));
Ответ 5
Вот небольшой кусочек класса, который я написал некоторое время назад:
/**
* Class XmlParser
* @author Francesco Casula <[email protected]>
*/
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 также для целей тестирования.
Ответ 6
Это должно работать
if(strpos($xmlstring, '<?xml') === 0) {
//is an xml
}
else {
//not an xml
}