如何检查一个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错误是一项非常简单的任务。 使用
libxml
function可以在加载文档时抑制所有XML错误,然后遍历错误。由
libxml_get_errors()
返回的libXMLError
对象包含几个属性,包括错误的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); }
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 }