Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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
}